如何使用fgets来读取和计算字符

时间:2013-07-07 19:27:31

标签: c

假设我想从stdin计算字符abcdef ...

代码:

int string[100] = "";
int a_count = 0...

while(fgets(string, sizeof(string), stdin))
{
    for(int y = 0; y < 100; y ++)
    {
        if(string[y] == 'a') a_count++;
        if(string[y] == 'b') b_count++;
           ...and so on...
    }
    //here I reset the string to empty.
}

上面的代码工作不正确(计算的数量超出预期),我在哪里犯了逻辑错误?

2 个答案:

答案 0 :(得分:2)

您需要在实际字符串的末尾终止for循环,而不是遍历整个数组。当你看到NUL终结器时,你需要停止。

while (fgets(string, sizeof(string), stdin) != NULL)
{
    for(int y = 0; string[y] != 0; y ++)
    {
        if(string[y] == 'a') a_count++;
        if(string[y] == 'b') b_count++;
           ...and so on...
    }
}

您无需将字符串设置为“空”&#39;经过处理后。稍后fgets()次来电只会覆盖它,这很好。

另外,您可能会想到更好的方法来编写实际的计数器,但这不是您提出的问题。

答案 1 :(得分:1)

问题在于,您不仅要计算字符串中的字符数,还要计算整个缓冲区中的任何垃圾。您不想这样做。循环直到字符串结尾。

此外,您可以使用简单的表/数组查找替换巨大的链式if,如下所示:

int counts[1 << CHAR_BIT] = { 0 };

while (fgets(buf, sizeof(buf), stdin) != NULL) {
    const char *p = buf;
    while (*p != 0) {
        counts[*p++]++;
    }
}

然后,最后,您可以按如下方式检索特定字符的计数:

printf("'a': %d occurrences\n", counts['a']);