1

我正在尝试计算一行中出现的字母。但是我的结果是错误的。我将只介绍我认为包含错误的功能。

void readAndCount(int &numWords, int letterCount[])
{
    //set letterCount[] numwords initial values
    memset(letterCount, 0, 26);
    numWords = 1;

    char a = ' ';
    while(a != '\n')
    {
        a = getc(stdin);
        if (a == ' ' || a == ',' || a == '.' || '\n')
            ++numWords;
        else
            if(a >= 'A' && a <= 'Z')
            {
                ++letterCount[a - 'A'];
            } else if (a >= 'a' && a <= 'z') {
                ++letterCount[a - 'a'];
            }
    }

    return;
}

这是一个字符串产生:

3 words
1 a
4194305 g
1 h
3 i
4196355 k
32630 n
4197445 o
32630 r
4197379 s
2 t
4196576 w
32767 z

在读取输入之前,我已经尝试过 fflush()ing stdin。任何指针将不胜感激,但请不要只为我写。

4

2 回答 2

3

memset(letterCount, 0, 26)将 26字节的内存清零,而不是您想要letterCount的 26个整数。怎么样memset(letterCount, 0, 26*sizeof(int))

于 2013-02-13T06:14:34.923 回答
3

由于这被标记为的调用替换为memset()

std::fill(letterCount, letterCount + 26, 0);

或者:

std::fill_n(letterCount, 26, 0);

...这将修复数组初始化。您在“f”之后看到的任意数字是加载程序之前 RAM 中的任何垃圾。

另外,这个:

if (a == ' ' || a == ',' || a == '.' || '\n')

应该:

if (a == ' ' || a == ',' || a == '.' || a == '\n')

注意:中,我们更喜欢std::cin.get(a);c 但这a = getc(stdin);对代码的执行方式没有影响,只是风格问题)。

于 2013-02-13T06:25:10.540 回答