C++ I';我在计算字符串中的字符时出现了错误的结果

C++ I';我在计算字符串中的字符时出现了错误的结果,c++,string,c,C++,String,C,我想数一数一行字母的出现次数。但我的结果是错误的。我将只展示我认为包含错误的函数 void readAndCount(int &numWords, int letterCount[]) { //set letterCount[] numwords initial values memset(letterCount, 0, 26); numWords = 1; char a = ' '; while(a != '\n') {

我想数一数一行字母的出现次数。但我的结果是错误的。我将只展示我认为包含错误的函数

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;
}
在读取输入之前,我已经尝试过刷新stdin。 任何指针都将不胜感激,但请不要只为我编写。

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

memset(letterCount,0,26)
letterCount
指向的26字节内存归零,而不是您想要的26个int。
memset(letterCount,0,26*sizeof(int))怎么样?

由于这是标记的,所以将对的
memset()的调用替换为:

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

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

此外,这:

if (a == ' ' || a == ',' || a == '.' || '\n')
应该是:

if (a == ' ' || a == ',' || a == '.' || a == '\n')
注意:在中,我们更喜欢s
a=getc(stdin)(但这对代码的执行方式没有影响,只是风格问题)。

因为这是标记的,所以将对的
memset()
的调用替换为:

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

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

此外,这:

if (a == ' ' || a == ',' || a == '.' || '\n')
应该是:

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

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

是打字错误吗<代码>||'\n'
。不应该是<代码> > a=`\n’/COD> <代码> FFLUW(STDIN)< /C>是未定义的行为。这里没有任何C++。也许C标记更合适。@Duck
int&numWords
是一个参考参数。啊,的确如此。我想这很重要。是打字错误吗<代码>||'\n'
。不应该是<代码> > a=`\n’/COD> <代码> FFLUW(STDIN)< /C>是未定义的行为。这里没有任何C++。也许C标记更合适。@Duck
int&numWords
是一个参考参数。啊,的确如此。我想这很重要。但是没有完全解决问题。但是没有完全解决问题。你知道,我只是在发布后注意到了“\n”,但是修复不会改变输出。奇怪吧?你确定你重建了可执行文件吗?你知道,我刚注意到发布后的“\n”,但修复不会改变输出。奇怪吧?你确定你重建了可执行文件吗?