前提
C言語で安全に文字入力を受け取るためのプログラムを書いていました。
scanf関数で改行まで最大255文字をcに入れ、入力された文字数をcharlengthに入れます。
EOFだったら異常終了扱いにします。
最初にEnterが押された、つまり文字が入力されなかったらその旨を伝えます。
最後に文字数を表示します。
実現したいこと
- 文字数を正しく表示する
- 文字が入力されなかったことを判定できるようにする
発生している問題・エラーメッセージ
1つ目に、Enterを入力しても何も反応しません。
bash
1■■■■@penguin:~/■■■/■■■■■$ ./myconvert 2アルファベットを入力 : (Enterを入力) 3 (何も反応しなかったのでCtrl+D) 4不正な入力が行われました。プログラムを終了します。 5■■■■@penguin:~/■■■/■■■■■$
2つ目に、文字を入力したときに文字数が正しく表示されません。(下の場合3と出てほしかった)
bash
1■■■■@penguin:~/■■■/■■■■■$ ./myconvert 2アルファベットを入力 : asd 3896 4■■■■@penguin:~/■■■/■■■■■$
該当のソースコード
C
1/* myconvert.c */ 2#include <stdio.h> 3#include <stdlib.h> 4 5int main(void) 6{ 7 char c[0X100]; 8 int charlength; 9 10 printf("アルファベットを入力 : "); 11 if (scanf("%255s[^\n]%n%*[\n]", c, &charlength) == EOF){ 12 printf("\n不正な入力が行われました。プログラムを終了します。\n"); 13 return EXIT_FAILURE; 14 } 15 if (charlength == 0){ 16 printf("入力が行われていません。\n"); 17 } 18 printf("%d\n", charlength); 19 20 return EXIT_SUCCESS; 21}
補足情報(FW/ツールのバージョンなど)
名前 | バージョン |
---|---|
ChromeOS | 107.0.5304.110 (Official Build) (64-bit) |
Linux(仮想環境) | Debian GNU/Linux 11 (bullseye) |
gcc | 10.2.1 20210110 (Debian 10.2.1-6) |
scanf でガンバルより 1 文字入力を回すほうが簡単な気がしますが。
