我正在为我的班级在Linux Ubuntu上编写一个C ++程序。该程序应该找到用户输入的字符串的频率。频率由句子中出现的每个字符的数量计算,然后除以句子中的最大字符。之后,我根据每个角色出现的百分比打印出星号。这是我写的代码
$objWriter
执行后,显示完美的结果;星号应该是应有的位置。 但我的问题发生在我开始输入长句时,例如我输入
输入一行文字: asd asd asd asd asd asd asd asd asd asd
在我输入" DONE"之后,它给出了垃圾结果,星号被搞砸了,在执行结束时,它显示了消息
分段错误(核心转储)
在这种情况下,我做错了什么?
答案 0 :(得分:1)
问题在于这部分代码。字母数组是长度为26个项目,当您输入长文本时,堆栈已损坏。它会在main()函数调用结束时导致段错误。
for(i=0; i<finalText.length(); i++){//convert letters to start at 0 as an 'a' from ascii code and so on
letters[i]=(int)charArray[i]-97;
storedValue[i] = 0;
}
for(i=0; i<finalText.length(); i++){//increment value in array for each letter
for(j=0; j<26; j++){
if(letters[i]==j)
storedValue[j]++;
}
}
答案 1 :(得分:0)
如果一切都适用于短输入字符串并且对于长输入字符串或具有“意外”字符的字符串发生灾难性故障,那么它总是指示您超出数组的末尾。
使用调试器可以确定崩溃的位置
你的实际问题在这里:
for(i=0; i<finalText.length(); i++){//convert letters to start at 0 as an 'a' from ascii code and so on
letters[i]=(int)charArray[i]-97;
storedValue[i] = 0;
}
因为storedvalue
只有26个条目,所以如果你的字符串长度为27个或更多,你就会开始覆盖你的堆栈。
顺便说一下,为什么你要将你的好std :: string转换为char数组呢?当你这样做时,你失去了很多免费的功能和可检查性,并且std :: string足以满足你的需要,而且你没有删除[] charArray,你就会有内存泄漏。
我不打算对长度进行检查,并使storedvalue成为256条目数组(但请记住,根据平台,字符可以是有符号或无符号的)。或者更好的是,使用std::map<char, int>
来保存计数。