如何在C中对单个字符进行扫描

如何在C中对单个字符进行扫描

在C中:我试图从用户那里获得charscanf当我运行该程序时,不要等待用户输入任何内容.

这是代码:

char ch;printf("Enter one char");scanf("%c", &ch);printf("%c\n",ch);

为什么不起作用?


富国沪深
浏览 669回答 3
3回答

墨色风雨

这个%c转换说明符不会自动跳过任何前导空格,因此如果输入流中有一个偏离的换行符(例如,来自上一项)scanf呼叫会立即消耗掉它。解决此问题的一种方法是在格式字符串中的转换说明符之前放置一个空格:scanf(" %c", &c);格式字符串中的空白显示scanf若要跳过前导空格,则第一个非空白字符将使用%c转换说明符

侃侃无极

首先,避免scanf()..使用它是不值得的痛苦。见:为什么大家都说不要用扫描呢?我应该用什么代替?中使用空白字符。scanf()如果需要读取更多的输入,会忽略输入流中留下的任意数量的空格字符吗?考虑:#include&nbsp;<stdio.h>int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;char&nbsp;ch1,&nbsp;ch2; &nbsp;&nbsp;&nbsp;scanf("%c",&nbsp;&ch1);&nbsp;&nbsp;/*&nbsp;Leaves&nbsp;the&nbsp;newline&nbsp;in&nbsp;the&nbsp;input&nbsp;*/ &nbsp;&nbsp;&nbsp;scanf("&nbsp;%c",&nbsp;&ch2);&nbsp;/*&nbsp;The&nbsp;leading&nbsp;whitespace&nbsp;ensures&nbsp;it's&nbsp;the &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous&nbsp;newline&nbsp;is&nbsp;ignored&nbsp;*/ &nbsp;&nbsp;&nbsp;printf("ch1:&nbsp;%c,&nbsp;ch2:&nbsp;%c\n",&nbsp;ch1,&nbsp;ch2); &nbsp;&nbsp;&nbsp;/*&nbsp;All&nbsp;good&nbsp;so&nbsp;far&nbsp;*/ &nbsp;&nbsp;&nbsp;char&nbsp;ch3; &nbsp;&nbsp;&nbsp;scanf("%c",&nbsp;&ch3);&nbsp;/*&nbsp;Doesn't&nbsp;read&nbsp;input&nbsp;due&nbsp;to&nbsp;the&nbsp;same&nbsp;problem&nbsp;*/ &nbsp;&nbsp;&nbsp;printf("ch3:&nbsp;%c\n",&nbsp;ch3); &nbsp;&nbsp;&nbsp;return&nbsp;0;}虽然使用前面的空格可以相同的方式固定第三个scanf(),但它并不总是像上面那样简单。另一个主要问题是,scanf()如果输入流与格式不匹配,则不会丢弃输入流中的任何输入。例如,如果您输入abc为了int例如:scanf("%d", &int_var);然后abc将不得不阅读和丢弃。考虑:#include&nbsp;<stdio.h>int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i; &nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(scanf("%d",&nbsp;&i)&nbsp;!=&nbsp;1)&nbsp;{&nbsp;/*&nbsp;Input&nbsp;"abc"&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Invalid&nbsp;input.&nbsp;Try&nbsp;again\n"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;printf("Int&nbsp;read:&nbsp;%d\n",&nbsp;i); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}另一个常见的问题是混合scanf()和fgets()..考虑:#include&nbsp;<stdio.h>int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;age; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;name[256]; &nbsp;&nbsp;&nbsp;&nbsp;printf("Input&nbsp;your&nbsp;age:"); &nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&age);&nbsp;/*&nbsp;Input&nbsp;10&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;printf("Input&nbsp;your&nbsp;full&nbsp;name&nbsp;[firstname&nbsp;lastname]"); &nbsp;&nbsp;&nbsp;&nbsp;fgets(name,&nbsp;sizeof&nbsp;name,&nbsp;stdin);&nbsp;/*&nbsp;Doesn't&nbsp;read!&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}打电话给fgets()不等待输入,因为前面的scanf()调用留下的换行符是Read,而fget()在遇到换行符时终止输入读取。还有许多其他类似的问题scanf()..这就是为什么人们通常建议避免这样做。那么,还有别的选择吗?使用fgets()函数以下列方式读取单个字符:#include&nbsp;<stdio.h>int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;line[256]; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;ch; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(fgets(line,&nbsp;sizeof&nbsp;line,&nbsp;stdin)&nbsp;==&nbsp;NULL)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Input&nbsp;error.\n"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;=&nbsp;line[0]; &nbsp;&nbsp;&nbsp;&nbsp;printf("Character&nbsp;read:&nbsp;%c\n",&nbsp;ch); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}使用时要注意的一个细节fgets()如果iNut缓冲区中有足够的空间,将在换行符中读取。如果它不可取,那么您可以删除它:char&nbsp;line[256];if&nbsp;(fgets(line,&nbsp;sizeof&nbsp;line,&nbsp;stdin)&nbsp;==&nbsp;NULL)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf("Input&nbsp;error.\n"); &nbsp;&nbsp;&nbsp;&nbsp;exit(1);}line[strcpsn(line,&nbsp;"\n")]&nbsp;=&nbsp;0;&nbsp;/*&nbsp;removes&nbsp;the&nbsp;trailing&nbsp;newline,&nbsp;if&nbsp;present&nbsp;*/
打开App,查看更多内容
随时随地看视频慕课网APP