c/c++语言开发共享scanf()将新行char留在缓冲区中

我有以下程序:

int main(int argc, char *argv[]) { int a, b; char c1, c2; printf("Enter something: "); scanf("%d",&a); // line 1 printf("Enter other something: "); scanf("%d", &b); // line 2 printf("Enter a char: "); scanf("%c",&c1); // line 3 printf("Enter another char: "); scanf("%c", &c2); // line 4 printf("Done"); // line 5 system("PAUSE"); return 0; } 

正如我在C书中读到的那样,作者说scanf()在缓冲区中留下了一个新的行字符,因此,程序不会在第4行停止供用户输入数据,而是将新行字符存储在c2中并移至第5行。

是对的吗?

但是,这只发生在char数据类型中吗? 因为我没有像第1,2,3行那样看到int数据类型的这个问题。是不是?

    scanf()函数在尝试解析字符以外的转换之前自动删除空格。 字符格式(主要是%c ;也是扫描集%[…] – 和%n )是例外; 他们不会删除空格。

    使用带有前导空格的" %c"可跳过可选空格。 不要在scanf()格式字符串中使用尾随空白。

    请注意,这仍然不会消耗输入流中留下的任何尾随空格,甚至不会消耗到行的末尾,因此如果在同一输入流上也使用getchar()fgets() ,请注意这一点。 我们只是让scanf 转换之前跳过空格,就像%d和其他非字符转换一样。


    请注意除转换之外的非空白“指令”(使用POSIX scanf术语 ),例如scanf("order = %d", &order);的文字文本scanf("order = %d", &order); 不会跳过空格。 文字order必须匹配要读取的下一个字符。

    所以你可能想要" order = %d" ,如果你想跳过前一行的换行符,但仍然需要在固定字符串上进行文字匹配, 就像这个问题一样 。

    使用scanf(" %c", &c2); 。 这将解决您的问题。

    在调用第二个scanf()之前使用getchar() scanf()

     scanf("%c", &c1); getchar(); // <== remove newline scanf("%c", &c2); 

      以上就是c/c++开发分享scanf()将新行char留在缓冲区中相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519529.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐