执行结束时的分段错误(核心转储)

时间:2015-09-07 07:06:59

标签: c++ linux

我正在为我的班级在Linux Ubuntu上编写一个C ++程序。该程序应该找到用户输入的字符串的频率。频率由句子中出现的每个字符的数量计算,然后除以句子中的最大字符。之后,我根据每个角色出现的百分比打印出星号。这是我写的代码

$objWriter

执行后,显示完美的结果;星号应该是应有的位置。 但我的问题发生在我开始输入长句时,例如我输入

  

输入一行文字: asd asd asd asd asd asd asd asd asd asd

在我输入" DONE"之后,它给出了垃圾结果,星号被搞砸了,在执行结束时,它显示了消息

  

分段错误(核心转储)

在这种情况下,我做错了什么?

2 个答案:

答案 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>来保存计数。