用户在逐字符扫描的字符串中无限输入

时间:2018-10-07 14:41:39

标签: c string

我正在尝试创建一个程序,该程序将计算字符的频率并将其与字符一起打印。

但是对于给定的字符串,我的程序正在无限输入最后一个字符。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct value
{
    long long as;
    long long k;
};

int main()
{
    long long count[128] = {0};
    char c;
    struct value max;
    max.k = 0; max.as = -1;

    // Upto Here was only initialization.

    while(1)
    {

        scanf("%c",&c);
        printf("%c",c);
        if(c!='\n')
        {
            count[c]++;
            if(max.as<count[c])
            {
                max.as = count[c];
                max.k = c;
            }
            if(max.as==count[c]&&max.k<c)
            {
                max.k = c;
            }
        }
        else break; // Apparently this is never executed.
    }

     printf("\n%c %lld",(char)(max.k),max.as);
}

类似于输入“ masaka”,在此处将输出显示为“ masakaaaaaaaaaaaaaaaaaaaaaaaa”,直到达到输出限制为止,均会打印a。

为什么在这里发生这种情况?

1 个答案:

答案 0 :(得分:1)

如果输入中没有换行符,则程序将循环,因为它不会检查EOF。

scanf()将在解析任何输入之前到达文件末尾时返回EOF

while(1)
{

    int result = scanf("%c",&c);
    if (result == EOF || result == 0) {
        break;
    }
    printf("%c",c);
    if(c!='\n')
    {
        count[c]++;
        if(max.as<count[c])
        {
            max.as = count[c];
            max.k = c;
        }
        if(max.as==count[c]&&max.k<c)
        {
            max.k = c;
        }
    }
    else break; // Apparently this is never executed.
}