我有以下程序:
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