C言語のscanf関数で入力した後に,もう一度scanf関数を使うとうまくできないんだけど...
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
【C言語】scanf関数の改行文字('\n')が残る問題の回避方法
C言語のscanf関数は,標準入力を標準入力から読み込むライブラリ関数です.
C言語を学ぶ時には必ずといって良いほど登場します.
試しに,scanf関数を利用する以下のコードを実行してみましょう.
15行目のscanf関数で文字列を入力した後に,18行目の2回目のscanf関数で文字を入力します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #define BUFSIZE 64 int main(void) { char buf[BUFSIZE]; char c; printf("Please input a string: "); scanf("%s", buf); printf("buf = %s\n", buf); printf("Please input an character: "); scanf("%c", &c); printf("c = %c\n", c); return 0; } |
実行結果は以下になります.
3行目でabcを入力した後に改行文字('\n')を入力して,文字を入力しようとしたところ,文字が入力できずに実行が終了してしまいました.
bufにabcは正しく入力できましたが,cに文字が正しく入力できていません.
1 2 3 4 5 6 7 |
$ gcc scanf.c $ a.out Please input a string: abc buf = abc Please input an character: c = $ |
上記が発生した理由は,scanf関数は次の(2回目の)scanf関数で読み込まれるバッファに改行を残すからです.
2回目のscanf関数の入力に%cを指定をしているため,挙動がおかしくなっています.
つまり,cには改行文字が入力されています.
それでは,scanf関数の改行文字が残る問題の回避方法を解説していきます.
getchar関数で改行文字('\n')を読み捨てる
getchar関数で改行文字('\n')を読み捨てるコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #define BUFSIZE 64 int main(void) { char buf[BUFSIZE]; char c; printf("Please input a string: "); scanf("%s", buf); printf("buf = %s\n", buf); getchar(); printf("Please input an character: "); scanf("%c", &c); printf("c = %c\n", c); return 0; } |
実行結果は以下になります.
正常に読み込めていることがわかります.
1 2 3 4 5 6 |
$ gcc scanf_getchar.c $ a.out Please input a string: abc buf = abc Please input an character: d c = d |
ダミー入力で改行文字('\n')を読み捨てる
ダミー入力で改行文字('\n')を読み捨てるコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #define BUFSIZE 64 int main(void) { char buf[BUFSIZE]; char dummy; char c; printf("Please input a string: "); scanf("%s", buf); printf("buf = %s\n", buf); scanf("%c", &dummy); printf("Please input an character: "); scanf("%c", &c); printf("c = %c\n", c); return 0; } |
実行結果は以下になります.同様です.
1 2 3 4 5 6 |
$ gcc scanf_dummy.c $ a.out Please input a string: abc buf = abc Please input an character: d c = d |
2回目のscanf関数の最初に改行文字('\n')を入れる
2回目のscanf関数の最初に改行文字('\n')を入れるコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #define BUFSIZE 64 int main(void) { char buf[BUFSIZE]; char c; printf("Please input a string: "); scanf("%s", buf); printf("buf = %s\n", buf); printf("Please input an character: "); scanf("\n%c", &c); printf("c = %c\n", c); return 0; } |
実行結果は以下になります.同様です.
ここで,scanf関数の第1引数の文字列に変換指定子以外の文字を書くと,その文字を正確に入力する必要があることに注意して下さい.
この場合は改行文字を正確に入力する必要があります.
1 2 3 4 5 6 |
$ gcc scanf_n.c $ a.out Please input a string: abc buf = abc Please input an character: d c = d |
2回目のscanf関数の最初にスペース(' ')を入れる
2回目のscanf関数の最初にスペース(' ')を入れるコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #define BUFSIZE 64 int main(void) { char buf[BUFSIZE]; char c; printf("Please input a string: "); scanf("%s", buf); printf("buf = %s\n", buf); printf("Please input an character: "); scanf(" %c", &c); printf("c = %c\n", c); return 0; } |
実行結果は以下になります.改行文字を入れる場合と同様です.
1 2 3 4 5 6 |
$ gcc scanf_space.c $ a.out Please input a string: abc buf = abc Please input an character: d c = d |
他の入力関数を利用する
他の入力関数を利用する方法は,以下の記事で解説しています.
まとめ
C言語のscanf関数の改行文字('\n')が残る問題の回避方法を紹介しました.
あなたにあう回避方法を選びましょう!
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!