使用char和scanf以及for循环的问题?

时间:2014-12-10 16:34:26

标签: c

我的问题是使用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;
}

2 个答案:

答案 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;