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')
注意:在中,我们更喜欢sa=getc(stdin)代码>(但这对代码的执行方式没有影响,只是风格问题)。因为这是标记的,所以将对的memset()
的调用替换为:
std::fill(letterCount, letterCount + 26, 0);
或:
…这将修复阵列初始化。在“f”之后看到的任意数字是加载程序之前RAM中的任何垃圾
此外,这:
if (a == ' ' || a == ',' || a == '.' || '\n')
应该是:
if (a == ' ' || a == ',' || a == '.' || a == '\n')
注意:在中,我们更喜欢sa=getc(stdin)代码>(但这对代码的执行方式没有影响,只是风格问题)。是打字错误吗<代码>||'\n'
。不应该是<代码> > a=`\n’/COD> <代码> FFLUW(STDIN)< /C>是未定义的行为。这里没有任何C++。也许C标记更合适。@Duckint&numWords
是一个参考参数。啊,的确如此。我想这很重要。是打字错误吗<代码>||'\n'
。不应该是<代码> > a=`\n’/COD> <代码> FFLUW(STDIN)< /C>是未定义的行为。这里没有任何C++。也许C标记更合适。@Duckint&numWords
是一个参考参数。啊,的确如此。我想这很重要。但是没有完全解决问题。但是没有完全解决问题。你知道,我只是在发布后注意到了“\n”,但是修复不会改变输出。奇怪吧?你确定你重建了可执行文件吗?你知道,我刚注意到发布后的“\n”,但修复不会改变输出。奇怪吧?你确定你重建了可执行文件吗?