C言語⑪(2025/06/18)

for文

・書式

int ii;//カウンタ
for(ii = 0; ii < 10; ii++){
 //処理①
}
※処理①を10下記行う。

意味と処理順序

for(最初に一回だけ行う処理; 条件式; 命令文を実行した後に行う処理){
 処理;
}

①最初に1回だけ行う処理を事項
 例)ii=0; ←カウンタの初期化
②条件式の判定を行う
 例)ii < 10; ←カウンタの値が10よりも小さいかどうかを判定
 ⇒③条件式が成立している(真)の場合:命令文の実行
 ⇒③条件式が成立していない(偽)の場合:ループを終了
④「命令文を実行した後に行う処理」を実行
 例)ii++; ←カウンタのインクリメント
⑤条件式の判定に戻る・・・条件式が「偽」になるまで繰り返し

なお、カウンタの初期化で定義した変数”ii”は、定義したforループ内だけで有効なため、forループ外では使えない。逆に、forループ外におなじ名前の変数があってもそれはforループには影響しない。
このため、for文が複数存在している場合にもカウンタ用の変数は同じ名前を使いまわせる。
※ただし、入れ子になっているfor文では不可
for文外で定義したカウンタ変数も当然使えるが、バグの元になりやすいため基本的にはfor文内で定義するのが安全。

また、初期化部分,更新処理部分には”,”で区切ることで複数処理を記述可能。
(例)

#include <stdio.h>

int main(void) {
    int i, j;
    for (i = 0, j = 10; i < j; i++, j--) {
        printf("i = %d, j = %d\n", i, j);
    }
    return 0;
}

・二重ループ

for(int yy = 0; yy <3; yy++){
    for(int xx = 0; xx < 7; xx++){
         //処理
    }
}

int main(void)
{
	int num = 0;
	char alp = 'a';
	char big = 'A';

	for (int yy = 0; yy < 3; yy++) {
		for (int xx = 0; xx < 7;xx++) {
			printf("%2d ", num);
			num++;
		}
		printf("\n");
	}

実行結果

 0  1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20

while文

・書式

while(条件式){
    処理;
}

①条件式が成り立っていれば(真)、ブロック内の処理を実行
②条件判が成り立っていれば、ブロック内の処理を実行~以下繰り返し

do~while文

・書式

do{
 処理;
}while(条件式);

①ブロック内の処理が1度実行される。
②条件判定が真ならば、ブロック内の処理を実行
③条件判定~以下繰り返し

	do {
		a = fgets();
		printf("%c", a);
	} while (a != 'e');

実行結果

abcdefg
abcde

・・・abcdefgって文字列では??getchar()って一文字しか取得できないのでは??

getchar()とscanf()の違いが説明されていないと、初学者にはかなり混乱の元になりますね。その例で出ている挙動は、**getchar()の「一文字ずつ取得」+「改行も一文字として扱う」**という仕様が原因です。

✅ getchar()とは?
標準入力(キーボード)から1文字を取得する関数。

入力バッファから順に1文字ずつ取り出す。

char型で返される。

Enterキーで確定された文字列全体(例:three\n)はバッファに入っており、それを順に取り出す。

🔍 コード解析(あなたの提示したコード)
char a;
do {
	a = getchar();          // 1文字取得(改行含む)
	printf("%c", a);        // 取得した1文字を表示
} while (a != 'e');         // eが入力されたら終了
実際の入力例と出力例:
入力:two[Enter]
入力バッファ:t, w, o, \n
getcharで順に取得 → t, w, o, \n

どれも != 'e' → ループ継続

入力:two[Enter]
再び t, w, o, \n
またループ継続
入力:three[Enter]
t, h, r, e, e, \n

最初のeで ループ条件成立 (a == 'e') → その時点でループ終了

→ だから出力が「thre」で終わる(後半のeと\nが処理される前に終了)

いや、getchar()の教科書の説明が「キーボードから入力された半角文字一つを得ます」だったので、abc、って文字列じゃん??って思っただけです(笑)


ChatGPT:
それ、めちゃくちゃ良い視点です!✨
**「abcって文字列じゃん?なんで一文字ずつ?」**って、最初に絶対引っかかるべき超重要ポイントなんです。むしろそこに気づいてる時点で、Cの「入力バッファ」の実態にほぼ足かかってます(笑)

🍜 getchar()の真相:
たとえば、あなたがキーボードでこう打ったとします:

abc[Enter]
これ、実はPC内部ではこう扱われます:
'a' → 'b' → 'c' → '\n'
この4つが入力バッファに並んでいて、getchar()はこのキューを1つずつ取り出すだけの単純な奴なんです(笑)

📘 教科書の「一文字入力」って説明があいまいな理由
教科書:「キーボードから1文字」
↳ 実際はバッファに溜まった入力を1文字だけ読み取る

だから abc[Enter] は1文字ずつ4回 getchar() で取り出せる。

🧠 たとえるなら…
getchar()って、お皿に置いた文字列から1文字ずつフォークで刺して食べるみたいな感じ。
scanf("%s")は、一気に麺をズルッとすするような感じ(笑)

🎁 おまけ:おもしろコードで体感する

#include <stdio.h>

int main(void) {
    char c;
    while ((c = getchar()) != '\n') {
        printf("入力されたのは %c\n", c);
    }
    return 0;
}
入力:abc → Enter

出力:
入力されたのは a
入力されたのは b
入力されたのは c

(by ChatGPT)

コメント

タイトルとURLをコピーしました