如何在 C 语言中对单个字符执行扫描

C: 我试图用 scanf从用户那里获取 char,当我运行它时,程序不会等待用户输入任何东西..。

这是密码:

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

为什么不工作?

643303 次浏览

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

解决这个问题的一种方法是在格式字符串的转换说明符前面放置一个空格:

scanf(" %c", &c);

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

在扫描之前把 fflush(stdin);放到清除缓冲区。

在% 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;
}

这里有一件类似的事情,我想和大家分享,

当你在 Visual Studio 上工作时,你可能会得到一个错误,比如:

“ Scanf”: 函数或变量可能不安全。考虑改用 scanf_s。要禁用弃权,请使用 _CRT_SECURE_NO_WARNINGS

为了防止这种情况,您应该使用以下格式编写它

单个字符可理解为:

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

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

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

使用字符串代替 char 喜欢

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

我觉得效果不错。

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

见: 为什么每个人都说不要使用 Scanf? 我应该用什么来代替?

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(如: scanf("%d", &int_var);)输入 abc,那么 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()时需要注意的一个细节是,如果输入缓冲区中有足够的空间,就会读入换行符。如果不想要,那么你可以移除它:

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

尝试使用 getchar () ;

句法:

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

这对我有用,试试看

int main(){
char c;
scanf(" %c",&c);
printf("%c",c);
return 0;
}

Fgets 和 getchar 都不能解决这个问题。 唯一的解决办法是在使用 Scanf 时在% c 前面保留一个空格 Scanf (“% c”,ch) ;//只能工作

在下面的 fgets 也不工作. 。

char line[256];
char ch;
int i;


printf("Enter a num : ");
scanf("%d",&i);
printf("Enter a char : ");


if (fgets(line, sizeof line, stdin) == NULL) {
printf("Input error.\n");
exit(1);
}


ch = line[0];
printf("Character read: %c\n", ch);

你必须使用一个有效的变量。 ch不是这个程序的有效变量。使用 char Aaa;

char aaa;
scanf("%c",&Aaa);

经过测试,成功了。

唯一对我有用的代码是:

scanf(" %c",&c);

我也有同样的问题,而且只有单个字符。经过一个小时的随机测试,我还不能报告一个问题。人们可能会认为,C 现在已经有了一个防弹功能,可以从键盘上检索单个字符,而不是一个可能的黑客数组... ... 我只是说说... ..。