0

假设我想从标准输入计算字符 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.
}

上面的代码工作不正确(比预期的要多),我在哪里犯了逻辑错误?

4

2 回答 2

2

问题是您不仅要计算字符串中的字符,还要计算整个缓冲区中的任何垃圾。你不想那样做。仅循环到字符串的末尾。

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']);

等等

于 2013-07-07T19:35:53.123 回答
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...
    }
}

处理后不需要将字符串设置为“空”。以后fgets()的调用只会覆盖它,这很好。

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

于 2013-07-07T19:30:35.820 回答