C言語におけるscanf()とgetchar()についての一点のまとめと国内C教材への一点のツッコミ

3492 ワード

最近再びC言語を学んで、みんなが1篇の招待状を見ることを提案します
http://tieba.baidu.com/p/2843103544?traceid=
多くの学生が国内の計算教材を手に入れた最初の時間にrjljt......自分で理解することを提案します.
次にscanf()とgetchar()の再学習についてのまとめです
この点について私もツッコミを入れて、国内のそんなに多い招待状を見て、言う論理が乱れているのではありませんことを発見して、さもなくばまだ間違っていて、その上多くは知りません
国内の教材の毒害が深すぎるのではないか、多くの論理にも問題がある.よし、あまり直接始めないでください.私はここで多くの人の例を引用しましたが、多くの人は自分がそのいくつかのブログを覚えていないかもしれません.もし引用があれば、コメントの中で私が変更するか、同意すれば転載します.
https://blog.csdn.net/zqixiao_09/article/details/50189477  転載の一節
入力操作の原理は、プログラムの入力にバッファ、すなわち入力バッファが構築されている.1回の入力プロセスでは、1回のキーボード入力が終了すると入力されたデータが入力バッファに格納され、cin関数は入力バッファから直接データを取得します.cin関数は直接バッファからデータを取り出すので、バッファに残留データがある場合、cin関数はキーボード入力を要求することなくこれらの残留データを直接取得することがあります.これが例では、入力文の失効の原因です.   
scanf()はSpace、Enter、Tabで入力を終了し、最後のリターン記号(すなわち、リターン記号がバッファに残る)を捨てる.
この言葉は3つの状況に分けて説明すべきだと思います.
まず、10進数を読み込む(つまりint型など、scanfは入力のタイプを指定することができます)
バッファからの読み込みは、スペース、Enter、Tabに遭遇すると終了しますが、一度に入力するときにスペースなどのタイプがある場合は、
次はscanfが直接バッファから読み出される(キーボード端末から読み出されるのではない)のですが、このときの読みはSpace、Enter、Tabといったものを捨てることに注意しましょう
スペースを直接読み込んだ後(次の1が入力子を終了する前に)
  int a,b;
  scanf("%d",&a);
  printf("%d
",a); scanf("%d",&b); printf("%d
",b); return 0;

テスト
12 13
出力結果12 13
もう1つのケースでは、最後の1つのリターン記号を捨てる、つまり複数回入力された最後のリターン記号がバッファに残る
 
2で説明するのは、文字列を読み取る場合です
scanf()は文字列を読み込むときも
スペース、Enter、Tabに遭遇すると読み取りは終了しますが、一度に入力するときにスペースなどのタイプがある場合は、
次はscanfが直接バッファから読み出される(キーボード端末から読み出されるのではない)のですが、このときの読みはSpace、Enter、Tabといったものを捨てることに注意しましょう
スペースを直接読み込んだ後(次の1が入力子を終了する前に)
  char str1[20], str2[20];
  scanf("%s",str1);
  printf("%s
",str1); scanf("%s",str2); printf("%s
",str2); return 0;

テスト結果
Hello world Hello world
ダイレクトリード入力が分離されていることがわかる
3つ目は文字の読み取りです
scanf()は文字の読み取り時にもSpace、Enter、Tabに遭遇すると今回の読み取りを終了しますが、このときのSpace、Enter、Tabは次の読み取り時に読み取られるので注意してください.もちろん最後のEnterは捨てられます
char ch;
     while (true)
     {
         scanf("%c", &ch);

         switch(ch)
         {
             case '1':
                 printf("haha
"); break; case '2': printf("cccccc
"); // fflush(stdin); // break; case '3': printf("555
"); break; case '
': printf("666
"); case ' ': printf("777
"); } }

入力123 hahaha ccc 555 666 777入力123 12 hahaha ccc 555 777 haha ccc 666 777
上の結果からわかるように
 
 
getchar()はEnterで入力を終了し、最後のEnterも破棄されます.
同時にgetcharは文字の入力読み取りにしか使用できません.getcharとscanfの文字読み取りの違いはgetcharがスペース文字を受け入れることです.もちろん、次回の読み取り時にもEnterを読み取り、最後のEnterを捨てます.
 
     char a,b,c,d;
     a=getchar();
     b=getchar();
     c=getchar();
     d=getchar();
     putchar(a);
     printf("
"); printf("%d
",a); putchar(b); printf("%d
",b); putchar(c); printf("%d
",c); putchar(d); printf("
"); printf("%d",d);

入力1 スペース4 1 49を入力
10  32 4 52以上の結果から分かる
 
以上の結果と例から両者の違いが直感的に分かるようになりましたが、このような小さな違いが私の午後とめくってしまいました.
十数回のブログで何度も実験をしていますが、Cが難しすぎるのか、国内の教材がごみの毒害が深すぎるのか、覚えておいてください.