こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C言語の意味

プログラミングの勉強をしています。
知り合いから,アルファベットの大文字を小文字に変換するプログラムについておしえてもらいました。

#include<stdio.h>
#include<ctype.h>
#define MCH 3
int main()
{
char chs[MCH];
printf("アルファベットの大文字を入力して下さい:");
fgets(chs,MCH,stdin);
chs[1]= '\0';
printf("小文字は[%c]です。\n",tolower(*chs));
return 0;
}
この中で,
3行目の#define MCH 3 のdefineの意味
6行目のchar chs[MCH]; のchs・MCHの意味
9行目のchs[1]= '\0'; これ自体の設定がわかりません。
教えてもらえないでしょうか?

投稿日時 - 2009-06-21 14:10:19

QNo.5062248

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>#3さん
>chs[1], chs[2] には行末コードという特別な文字が入ります。

そうではありません。
chs[1]には'\n'が、chs[2]には'\0'が、それぞれ入ります。

投稿日時 - 2009-06-21 16:22:09

ANo.3

> #define MCH 3 のdefineの意味

この場合 MCH という文字列は、すべて 3 に置き換えられます。
これはマクロの一番簡単な例です。

つまり、char chs[MCH]; という行は char chs[3]; になり、
fgets(chs, MCH, stdin); という行は fgets(chs, 3, stdin);
と置き換えられ、それからコンパイルされます。
MCHという文字列(マクロ)を使わなくても同じプログラムができますが、
理由はともかく、マクロを使うと良いことがあるので、こうする習慣があります。

> 6行目のchar chs[MCH]; のchs・MCHの意味

上記の通り chs[MCH]; は chs[3]; と同じです。
ここでは、配列の大きさ(要素の数)が3である、
char(文字)型の配列変数を宣言してます。

キーボードでタイプしたキーをfgets()で読み込んでますが、
読み込んだ文字列を格納する場所として配列が必要なのです。

"chs", "MCH" という名前は、プログラムを書いた人が適当に決めた、固有名詞のようなものです。

> 9行目のchs[1]= '\0'; これ自体の設定がわかりません。

「設定」ではなく、この操作の意味がわからないのですね。

まず、chs[3] という配列には chs[0], chs[1], chs[2] と、
文字の入る場所が3つあります。

このプログラムを実行した時に、例えば A(とEnterキー)をタイプしたとすると、
chs[0] には 'A' が入る(格納される)わけです。
ただし格納されるのは、'A'一文字だけではありません。
ここで使っている、fgets() は、一文字ではなく、一行を入力する関数なので、chs[1], chs[2] には行末コードという特別な文字が入ります。

大文字をタイプするときに Enter キーも押しますよね。
行末コードとはEnterキーに対応する、特別な文字だと思えばよい。
行末コードは特別な文字ですが、
'\0' も特別な文字で、文字列の最後を示す文字です。

chs[1] = '\0'; という代入をすることによって、
chs[0] には 'A'が有り、chs[1]には(行末コードではなく)'\0' が入るわけですから、
その結果、chs[] 文字列配列には "A" という文字列が入った状態になります。
要するに、プログラムを作った方は、"A" という「文字列」が入った状態にしてから tolower(*chs) を実行したかったのでしょう。

ところが実は chs[1] = '\0'; をする必要はありません(この行を削除しても問題ない)。
何故なら、tolower() の引数は、文字列(配列)ではなく、
文字(この場合 chs[0] の一文字)だけで、
chs[1]には何が入っていても構わないからです。
ちなみに、*chs と chs[0] は、同じ意味になります。

…という説明ができますが、今の段階ではわからないことだらけでしょうね、きっと(笑)。

投稿日時 - 2009-06-21 15:57:28

ANo.2

まずは、その知り合いの方に、そのコードのこころについて
教えてもらうのがいいのではないでしょうか。

ここで解説したのと知り合いの方の意図とが食い違っていると、
よけいな混乱を招いてしまいそうです。

投稿日時 - 2009-06-21 15:13:41

ANo.1

3行目の#define MCH 3 のdefineの意味

「MCHという言葉を3と定義する」ということです。
以降MCHの部分を3に置き換えればよいでしょう。

6行目のchar chs[MCH]; のchs・MCHの意味

MCHは3なので
char chs[3];
ですね。
これで意味がわからないならば変数、配列の勉強をしなおさないと今後C言語を使うのは厳しいでしょう。

9行目のchs[1]= '\0'; これ自体の設定がわかりません。
最初の一文字以外は無視したかったのでしょう。
これで意味がわからないならばString型(文字列)変数の勉強をしなおしましょう。

投稿日時 - 2009-06-21 15:10:13

あなたにオススメの質問