for 循环不遍历整个数组

For loop not iterating through whole array

本文关键字:数组 遍历 循环 for      更新时间:2023-10-16

所以我对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;
            }
        }
    }

看起来问题是你总是希望在标签单词后找到一个空格,并且在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方法,同时避免了冗余工作、无意义的对象复制和内存碎片。