ロゴ ロゴ

入力された単語の大文字変換

こんにちは、じゃた。です。今回もマイフレンドの課題のお手伝いで書いたプログラムの記録を。言語はCです。

今回のプログラムについて

 今回は3つの単語を入力し、それをすべて大文字で出力するというプログラムを作成しました。また、条件として以下の項目が与えられていました。

1. string.h をインクルードしない
2. 単語の数はマクロ変数で定義
3. 2次元配列で英単語を入力
4. 小文字を大文字変換する toUpper 関数を作成

string.h 、なぜ使ってはいけないんだ…😢

プログラム

 前の項目で述べた条件に則ってプログラムを記述しました。

#include<stdio.h>
#define N 3
void toUpper(char s[100]);

int main(void){

    char str[N][100];
    printf("%d単語を入力\n",N);

    for(int i = 0; i < N; i++){
        printf("word%d > ",i);
        scanf("%s",str[i]);
        toUpper(str[i]);
    }

    for(int i = 0; i < N; i++){
        printf("%s\n",str[i]);
    }

    return 0;
}

void toUpper(char s[100]){
    int num = 0;
    while(s[num] != '\0'){
        if('a' <= s[num] && s[num] <= 'z'){
            s[num] = s[num] + ('A' - 'a');
        }
        num++;
        if (num == 99) break;
    }
}

 以下の文章で”箱”という言葉を使用しますが、これは配列に対しての私のイメージです。例えば、n[3]という配列を準備したとして、n[0]が0番目の箱、n[1]が1番目の箱、という感じです。数字を箱に付けられた番号という風に考えています。
 30行目のbreakについてですが、書いたほうがいいのかどうかすごく悩みました。というのも、今回文字列配列として用意したものは”str[N][100]”ですが、どんなに長い文字列でも99番目の箱にはNULL文字が入ってくるはずです。もともと準備した箱は100個しかないので、理論的にはそうなるはずですよね。ということは、確実に99番目の箱の中身についての処理を行う際は、while文の外に出ていくはずです。なんですが、もしもなんらかの問題が生じて99番目がNULL文字でないと判断されてしまったとき、もしかしたら無限ループになる可能性があるのではないかと思いました。実際どうかはわかりませんが、私は知識が浅くてそこのところよくわからなかったので、保険で書いておきました。
 とはいえ、「よくわからなかったから保険で書いておいた。」で終わらせるのもどうかと思うので、先輩に意見を聞いてきました。今回のプログラムではscanfで文字列を入力していますが、どうやら範囲を越えて入力できてしまうらしいです。なぜかC言語は範囲外にもアクセスできてしまうらしく、解決策はないそうで…。結論として、範囲外にアクセスできてしまうとバグる可能性があるから、それは極力避けたい。ので、breakは書いておいたほうがいいのでは。ということです。

おまけ

 小文字に変えるパターンの関数も載せときます。これを前述のものと組み合わせれば大文字だったら小文字に、小文字だったら大文字にっていうのもできますね。

void toLower(char s[100]){
    int num = 0;
    while(s[num] != '\0'){
        if('A' <= s[num] && s[num] <= 'Z'){
            s[num] = s[num] - ('A' - 'a');
        }
        num++;
        if (num == 99) break;
    }
}

おわりに

私のブログ、課題の手伝い記録ばかりになりそう…。
最後まで見てくれてありがとうございます!See You Next Time!
special thanks:みかんさん

コメント入力

関連サイト