scanf()是否不读取EOF?

scanf()是否不读取EOF?,c,C,我在写一个程序 #include <stdio.h> int char_value(int); void main() { int ch; printf("Enter characters : "); scanf("%c", &ch); for (printf("Letter is_Letter letter_Postion\n"); ch!=EOF; scanf("%c", &ch)) { if (isalp

我在写一个程序

#include <stdio.h>
int char_value(int);

void main()
{
    int ch;
    printf("Enter characters : ");
    scanf("%c", &ch);
    for (printf("Letter is_Letter letter_Postion\n"); ch!=EOF; scanf("%c", &ch))
    {
        if (isalpha(ch))
            printf("   %-3c %-9s      %d\n", ch, "   Yes", char_value(toupper(ch)));
        else if (isspace(ch))
            printf("#SPACE %-9s      N/A\n", "   No");
        else if (!isgraph(ch))
            printf("#BLANK %-9s      N/A", "   No");
        else
            printf("   %-3c %-9s      N/A\n", ch, "   No");
    }
}

int char_value(int ch)
{
    return ch-64;
}
然后,程序按预期运行。为什么会这样?scanf是否不读取EOF?

否,因为EOF不是字符,所以scanf不会将ch设置为EOF

引自文件:

返回值 成功时,函数返回成功填充的参数列表的项数。由于匹配失败、读取错误或到达文件末尾,此计数可以与预期的项目数匹配,甚至可以小于零

适用于您的案例:您需要检查scanf%c的返回代码,&ch:

如果为1,则设置ch。 如果为0,则ch未定义。
检查returns.EOF本身不是字符,它是在到达输入流末尾时设置的条件。scanf和getchar都返回EOF以指示流上没有更多的输入。对于scanf%c和&ch,如果为0,则不应返回EOF。在文件末尾ch未更改的情况下,预期返回值为EOF。预期返回值为EOF,错误时ch不确定。如果在读取过程中发生读取错误或到达文件末尾,您的引用将被设置为正确的指示符。。。。如果其中任何一种情况发生在任何数据成功读取之前,则返回EOF。如果EOF的行为与字符不同,那么getchar如何读取它并将其分配给ch?@RaviRaj EOF是一个int-1,因此超出字符范围0x00。。。0xff。因此int getchar可以返回一个字符,如果没有读到任何内容,也可以返回EOF。@chux RestoreMonica你的意思是scanf永远不会返回0?@chux RestoreMonica你能举个例子说明scanf返回0,因为我想不出一个。
#include <stdio.h>
int char_value(int);

void main()
{
    int ch;
    printf("Enter characters : ");
    ch=getchar();
    for (printf("Letter is_Letter letter_Postion\n"); ch!=EOF; ch=getchar())
    {
        if (isalpha(ch))
            printf("   %-3c %-9s      %d\n", ch, "   Yes", char_value(toupper(ch)));
        else if (isspace(ch))
            printf("#SPACE %-9s      N/A\n", "   No");
        else if (!isgraph(ch))
            printf("#BLANK %-9s      N/A", "   No");
        else
            printf("   %-3c %-9s      N/A\n", ch, "   No");
    }
}

int char_value(int ch)
{
    return ch-64;
}