所以我仍然是C ++的新手,我创建了这个循环来浏览我在.csv文件中的一长串推文,我将其导入到一个30,000的数组中。现在,HashAll函数用于查看每条推文,找到有#的位置,然后将该单词复制到一个新字符串中,然后将该新字符串放入一个新数组中以收集使用的主题标签。问题是,每次我测试我的代码时,我都会得到核心转储,但我无法弄清楚原因。这是我的代码如下。感谢您的任何帮助!
void AllTweets::HashAll(){
int counter=0;
for(int i=0; i<30000;i++){ //loop to looks are every tweet indv.
string singleTweet = Tweet[i];
int x = singleTweet.length();
for(int j=0;j<x;j++){
string newHash;
if(singleTweet[j]=='#') {
int k=j;
while(singleTweet[k]!=' '){
newHash=newHash+singleTweet[k];
k=k+1;
}
HashtagAll[counter]=newHash;
counter=counter+1;
}
}
}
答案 0 :(得分:1)
看起来问题是你总是期望在hashtag单词之后找到一个空格,并且在while()
循环中搜索它时,你永远不会测试你是否没有外推字符串的大小。
一个简单的解决方案是在循环中包含该测试:
while (singleTweet[k] != ' ' && k < x)
{
newHash = newHash + singleTweet[k];
k++;
}
但是我强烈要求重新考虑这些代码,这里发生的事情要多于眼睛。每次将newHash
增加1个字符时,就会强制它重新定位到内存中可以适应新大小的新空间,从而创建不必要的,耗时的工作,并在整个地方分割内存,更不用说这不是如何使用C ++中的字符串。
类std::string
不仅仅是一个自我调整大小的缓冲区,它提供了各种处理文本和字符串的方法,使您的代码更加客观,生活更轻松,您应该使用它们。例如,您的方法可以重写为更像这样:
void AllTweets::HashAll()
{
size_t counter = 0;
for (size_t i = 0; i < 30000; ++i)
{
size_t find = 0;
while ((find = Tweet[i].find("#", find)) != std::string::npos)
{
size_t end = Tweet[i].find(" ", find + 1);
if (end == std::string::npos)
{
HashtagAll[counter++] = Tweet[i].substr(find);
break;
}
HashtagAll[counter++] = Tweet[i].substr(find, end - find);
find = end + 1;
}
}
}
此代码使用旨在处理此问题的std::string
方法,同时避免冗余工作,对象的无意义复制和内存碎片。