
プログラミングの勉強をしています。
知り合いから,アルファベットの大文字を小文字に変換するプログラムについておしえてもらいました。
#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'; これ自体の設定がわかりません。
教えてもらえないでしょうか?
No.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型(文字列)変数の勉強をしなおしましょう。
No.4
- 回答日時:
>#3さん
>chs[1], chs[2] には行末コードという特別な文字が入ります。
そうではありません。
chs[1]には'\n'が、chs[2]には'\0'が、それぞれ入ります。
No.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] は、同じ意味になります。
…という説明ができますが、今の段階ではわからないことだらけでしょうね、きっと(笑)。
No.2
- 回答日時:
まずは、その知り合いの方に、そのコードのこころについて
教えてもらうのがいいのではないでしょうか。
ここで解説したのと知り合いの方の意図とが食い違っていると、
よけいな混乱を招いてしまいそうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
%dなどの違い
-
C#で文字列から数値だけ取得す...
-
構造体→文字列→構造体 をする方法
-
PIC18F26K22でsscanf関数を使い...
-
「一文字ずつ抜き出す」どうや...
-
C言語の問題です。
-
シリアル通信で0x00を送信した...
-
nullと""、\\0とEOFの違いにつ...
-
C++で文字列の右端から特定の文...
-
配列の要素数に変数を入れたい...
-
System.IO.Directory.GetFiles...
-
関数から配列を返すには?
-
複数の選択範囲の行番号を個別...
-
char型にint型の数値を代入する。
-
newとdeleteでのアサート
-
VBAのプログラムで、DIAG = 1# ...
-
reallocについて
-
VB.NETでファイル名順にファイ...
-
キーボード配列をもとに戻す方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WSH(VBS)でJSONの文字列を読み...
-
バイナリファイル中の日本語文...
-
nullと""、\\0とEOFの違いにつ...
-
C#でstringをポインタとして渡す
-
%dなどの違い
-
_tcscpy_s(wcscpy_s)の第二引数...
-
プログラムによく出てくるst...
-
TCL言語で文字列検索方法を教え...
-
構造体→文字列→構造体 をする方法
-
プログラム問題・・・
-
C++で入力した文字列から数字を...
-
16進数を2文字ずつ配列に格納し...
-
[C++]WCHARの1文字目しか表示で...
-
シリアル通信で0x00を送信した...
-
char型配列の最大要素数
-
VB6.0でのバイナリデータの扱い...
-
sprintf関数での文字列変換につ...
-
Excelシートを固定長のテキスト...
-
c#で他のアプリの文字入力フォ...
-
CSVファイルの「”」について
おすすめ情報