我的问题是使用char和scanf。您可以在下面找到几乎正常工作的代码。问题是关于for循环。你看,我想问用户10个字符,并计算字母数,但是循环不能正常工作。它正确地计算输入数量。例如,如果用户键入6,它很好,或者a,它也很好,但是如果他键入例如10或11,那么程序认为用户输入了2个不同的字符,但实际上用户只键入了一个字符“10”。所以,请帮助我,并解释一下,为什么scanf whit char无法正常工作。谢谢!
#include <stdio.h>
#include <stdlib.h>
unsigned int countalpha(void){
printf("Please enter 10 characters:\n");
char b;
int sum = 0;
int i = 0;
for (i = 0; i<10; i++)
{
scanf("%c\n", &b);
if (isalpha(b))
sum = sum +1;
else
sum = sum;
}
return sum;
}
int main()
{
int sum;
sum = countalpha();
printf ("Letters totally: %d", sum);
return 0;
}
答案 0 :(得分:4)
scanf()
功能难以正确使用。
scanf()
格式字符串中的尾随空格对于交互式输入来说是恶魔般的。符号"%c\n"
表示读取一个字符;然后跳过下面的空白区域,直到下一个不是空格的字符,然后才从函数返回。这很少是你想要的。用户需要输入一个字符,可能是a
,一个返回,另一个,以及一些空白,依此类推,但输入不会返回,直到沮丧地输入&# 39;你这个愚蠢的节目&#39; (和换行符),此时一切都突然开始工作,除了他们的评论可能不是下一次输入的正确答案。或者他们打中断,再也不会再运行你的程序了,因为对他们来说太令人沮丧了。
请注意,scanf()
格式字符串中的任何空格字符表示“跳过可选空白区域”,这意味着如果它们是空格,则会跳过空格,制表符,换行符(以及各种更加模糊不清的字符)现在,但如果没有空白,那就没问题了。另请注意,唯一不会跳过空格的转换说明符是%c
,%[...]
和%n
;所有其他转换说明符会自动跳过空格。
您应该使用" %c"
。这意味着&#39;跳过空白区域,然后返回不是空白区域的字符&#39;。或者,根据您的代码,您只需使用"%c"
,或者甚至更好:
int c;
while ((c = getchar()) != EOF)
{
if (isalpha(c)
sum++;
}
如果您想要面向行的输入,请不要使用scanf()
或fscanf()
;使用fgets()
或getline()
后跟sscanf()
。
顺便说一下,这些行:
else
sum = sum;
毫无意义。编译器可能会对它们进行优化,但是其他人不应该被迫阅读它们并且不知道你在想什么。
答案 1 :(得分:0)
用户是否应该在每个角色之间按ENTER键?您的格式字符串"%c\n"
表示它们应该,但您的问题陈述另有说明。请尝试删除\n
。
进一步的观点:
scanf()
返回已解析和分配的项目数。您应该始终检查此返回以确保已分配预期的项目数。 else
sum = sum;