在C中:我试图用scanf
从用户那里获取字符,当我运行它时,程序不会等待用户输入任何东西……
代码如下:
char ch;
printf("Enter one char");
scanf("%c", &ch);
printf("%c\n",ch);
为什么不起作用?
发布于 2012-11-25 00:31:03
%c
转换说明符不会自动跳过任何前导空格,因此如果输入流中有零散的换行符(例如,来自前一个条目),scanf
调用将立即使用它。
解决此问题的一种方法是在格式字符串中的转换说明符之前放置一个空格:
scanf(" %c", &c);
格式字符串中的空格告诉scanf
跳过前导空格,将使用%c
转换说明符读取第一个非空格字符。
发布于 2016-12-03 23:02:48
首先,避免使用scanf()
。使用它是不值得痛苦的。
请参阅:Why does everyone say not to use scanf? What should I use instead?
在scanf()
中使用空格字符将忽略输入流中剩余的任意数量的空格字符,如果需要读取更多的输入怎么办?考虑一下:
#include <stdio.h>
int main(void)
{
char ch1, ch2;
scanf("%c", &ch1); /* Leaves the newline in the input */
scanf(" %c", &ch2); /* The leading whitespace ensures it's the
previous newline is ignored */
printf("ch1: %c, ch2: %c\n", ch1, ch2);
/* All good so far */
char ch3;
scanf("%c", &ch3); /* Doesn't read input due to the same problem */
printf("ch3: %c\n", ch3);
return 0;
}
虽然第三个scanf()可以使用前导空格以相同的方式修复,但它并不总是像上面那样简单。另一个主要问题是,如果输入流中的任何输入与格式不匹配,scanf()
将不会丢弃任何输入。例如,如果您为int
输入abc
,例如:scanf("%d", &int_var);
,那么abc
将必须读取并丢弃。考虑一下:
#include <stdio.h>
int main(void)
{
int i;
while(1) {
if (scanf("%d", &i) != 1) { /* Input "abc" */
printf("Invalid input. Try again\n");
} else {
break;
}
}
printf("Int read: %d\n", i);
return 0;
}
另一个常见的问题是混合使用scanf()
和fgets()
。考虑一下:
#include <stdio.h>
int main(void)
{
int age;
char name[256];
printf("Input your age:");
scanf("%d", &age); /* Input 10 */
printf("Input your full name [firstname lastname]");
fgets(name, sizeof name, stdin); /* Doesn't read! */
return 0;
}
对fgets()
的调用不会等待输入,因为前一次scanf()调用留下的换行符是read的,fgets()在遇到换行符时会终止输入读取。
与scanf()
相关的还有许多其他类似的问题。这就是为什么通常建议避免它的原因。
那么,还有什么选择呢?请按以下方式使用fgets()
函数来读取单个字符:
#include <stdio.h>
int main(void)
{
char line[256];
char ch;
if (fgets(line, sizeof line, stdin) == NULL) {
printf("Input error.\n");
exit(1);
}
ch = line[0];
printf("Character read: %c\n", ch);
return 0;
}
使用fgets()
时需要注意的一个细节是,如果inut缓冲区中有足够的空间,则会读入换行符。如果它不受欢迎,那么您可以将其删除:
char line[256];
if (fgets(line, sizeof line, stdin) == NULL) {
printf("Input error.\n");
exit(1);
}
line[strcpsn(line, "\n")] = 0; /* removes the trailing newline, if present */
发布于 2018-07-10 22:54:47
这对我很有效,试试看。
int main(){
char c;
scanf(" %c",&c);
printf("%c",c);
return 0;
}
https://stackoverflow.com/questions/13542055
复制相似问题