scanf()是否不读取EOF?

时间:2018-07-28 12:10:54

标签: 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 (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;
}

for循环没有终止,但是当我将scanf()替换为getchar()

#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;
}

然后该程序按预期运行。为什么会这样呢? scanf()不读EOF吗?

1 个答案:

答案 0 :(得分:1)

否,由于EOF不是字符,scanf不会将ch设置为EOF

引自scanf文档:

  

返回值
  成功时,该函数返回已成功填充的参数列表的项目数。由于匹配失败,读取错误或文件结尾的范围,此计数可以与预期的项目数匹配或更少(甚至为零)。

适用于您的情况:您需要检查scanf("%c", &ch)的返回码:

  • 如果为1,则设置ch
  • 如果为0,则ch未定义。