为什么scanf函数会自动获取前一个'\ n'值,如何从此事件中逃脱?

时间:2014-11-01 18:54:37

标签: c scanf

我在编写代码方面并不陌生。但我只是在学习C语言。我无法理解这个主题。也许这不是问题,但现在对我来说这是一个问题。你能解释一下吗?

以下是我遇到的代码:

#include <stdio.h>


int main(int argc, char *argv[])
{
    char letter;

    while (1)
    {
        printf("Enter a letter:\n");
        scanf("%c", &letter);

        switch (letter)
        {
            case 'a':
            case 'A':
            case 'e':
            case 'E':
            case 'i':
            case 'I':
            case 'u':
            case 'U':
            case 'o':
            case 'O':
                printf("%c is a vowel letter.\n", letter);
                break;
            case 'y':
            case 'Y':
                printf("%c is sometimes a vowel letter.\n", letter);
                break;
            default:
                printf("%c is not a vowel letter.\n", letter);
        }
    }

    return 0;
}

输出:

Enter a letter:
a
a is a vowel letter.
Enter a letter:

 is not a vowel letter.
Enter a letter:

1 个答案:

答案 0 :(得分:1)

将格式从"%c"更改为" %c"以使scanf丢弃所有空格(由isspace()确定," \v\f\r\n\t"在POSIX和C语言环境中确定在分配下一个角色之前,无论它是什么。

也许是更好的选择,请使用fgets阅读整行,然后使用sscanf来解析它。

顺便说一句,请注意scanf总是会失败。成功时,它返回已分配参数的数量 另外,我强烈建议您阅读我上面链接的scanf - 联机帮助页(甚至更好,scanf上的C标准),因为您可能还不知道有很多陷阱。