如何为C中的单个char使用scanf

在C:我试图从用户使用scanf获得char,当我运行它的程序不等待用户input任何东西…

这是代码:

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

为什么不工作?

%c转换说明符不会自动跳过任何前导空格,所以如果inputstream中有一个杂乱的换行符(例如,来自前一个条目),则scanf调用将立即使用它。

解决此问题的一个方法是在格式string的转换说明符之前放置一个空格:

 scanf(" %c", &c); 

格式string中的空格告诉scanf跳过前导空格,并且将使用%c转换说明符读取第一个非空白字符。

首先,避免scanf() 。 使用它是不值得的痛苦。

看: 为什么大家都说不要使用scanf? 我应该用什么来代替?

scanf()使用空白字符会忽略inputstream中留下的任意数量的空白字符,如果需要读取更多input,该怎么办? 考虑:

 #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()不会丢弃inputstream中的任何input,如果它不符合格式。 例如,如果inputabc作为int ,如: 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()的调用不会等待input,因为前一个scanf()调用留下的换行符被读取,fgets()在遇到换行符时终止input读取。

还有许多与scanf()相关的其他类似问题。 这就是为什么通常build议避免它。

那么,有什么select? 使用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; } 

如果在inut缓冲区中有足够的空间,则使用fgets()时要注意的一个细节将在换行符中读取。 如果不合适,则可以将其删除:

 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 */ 

在scanf之前把fflush(stdin); 清除缓冲区。

这是我想分享的一个类似的东西,

当你在Visual Studio上工作时,你可能会得到如下错误:'scanf':函数或variables可能是不安全的。 考虑使用scanf_s代替。 要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS

为了防止这种情况,你应该用下面的格式来写

单个字符可以被读取如下:

 char c; scanf_s("%c", &c, 1); 

当读取非空终止string的多个字符时,将使用整数作为宽度指定和缓冲区大小。

 char c[4]; scanf_s("%4c", &c, _countof(c)); 

问候,

尝试使用getchar(); 代替

句法:

 void main() { char ch; ch = getchar(); } 

在%c转换说明符之前提供一个空格,以便编译器将忽略空格。 程序可能写成如下:

 #include <stdio.h> #include <stdlib.h> int main() { char ch; printf("Enter one char"); scanf(" %c", &ch); /*Space is given before %c*/ printf("%c\n",ch); return 0; } 

使用string,而不是像char

 char c[10]; scanf ("%s", c); 

我相信它的作品很好。

这适合我:

  #include <stdio.h> int main (void) { char a; scanf ("%c", &a); printf ("%c\n", a); return 0; } 

不知道为什么你的代码是行不通的。 我用Codelite和gcc