用程序接收分段错误来分割句子

时间:2014-03-08 05:58:43

标签: c++ segmentation-fault

当我运行我的程序时我的指针有问题我收到了一个分段falut(核心转储)任何人都可以帮助我知道哪个部分发生了这个错误?

这是一个通过获取分裂器来分割句子的程序,我使用了两个提到的数组

#include <iostream>
using namespace std;


int main(int argc, char **argv)
{
    char Sentence[255];
    cin.getline(Sentence,255);
    char splitter='_';
    int lenOfStr=0;
    int numOfWords=1;
    while (Sentence[lenOfStr]!='\0'){
        if (Sentence[lenOfStr]==splitter) numOfWords++;
        lenOfStr++;
    }

    char** words=new char* [numOfWords];
    int* lenOfEachWord=new int[numOfWords];
    int lenth=0,wordNum=0;
    for (int i=0;i<lenOfStr;i++){
        if (Sentence[i]==splitter) {
            lenOfEachWord[wordNum]=lenth;
            lenth=0;
            wordNum++;
        }
        else lenth++;

    }
    for (int word=0;word<numOfWords;word++){
        int lenth=lenOfEachWord[word];
        words[word]=new char[lenth];
    }
    int word=0;
    int chr=0;
    while (chr<lenOfStr){
        for (int i=0 ;i<lenOfEachWord[word];i++){
            words[word][i]=Sentence[chr];
            chr++;
        }
        word++;
    }
    for (int i=0;i<numOfWords;i++){
        for (int j=0;j<lenOfEachWord[i];j++){
            cout<<words[i][j];
        }
        cout<<endl;
    }
    for (int i=0;i<numOfWords;i++){
        delete[] words[i];
    }
    delete[] words;


    return 0;
}

2 个答案:

答案 0 :(得分:0)

下面:

while (chr<lenOfStr){
    for (int i=0 ;i<lenOfEachWord[word];i++){
        words[word][i]=Sentence[chr];
        chr++;
    }
    word++;
}

你没有处理拆分器字符,如果Sentence中的字符数 ,那么循环就会严重失败。

更一般地说,在测试任何代码之前你编写了很多代码,这是一个肯定的错误路径。

答案 1 :(得分:0)

您应该尝试为代码添加日志。我尝试使用这段代码进行测试,并且发现有一些你错过了注意的边界,比如你错过了最后一个字,并且在复制过程中没有排除分割器。但我不确定你确定单词数量的方式是否正确,我认为样本输入应该只有两个单词。

但是我会留给你决定。希望它有所帮助

输入:_test_string _

输出:

numOfWords: 4
lenOfStr: 13
0 4 6 0 
0
1
1 0 1 t
1 1 2 e
1 2 3 s
1 3 4 t
2
2 0 6 s
2 1 7 t
2 2 8 r
2 3 9 i
2 4 10 n
2 5 11 g

test
string

#include <iostream>
#include <cstring>
using namespace std;



int main(int argc, char **argv)
{
    char Sentence[255];
    cin.getline(Sentence,255);
    char splitter='_';
    int lenOfStr=0;
    int numOfWords=1;
    while (Sentence[lenOfStr]!='\0'){
        if (Sentence[lenOfStr]==splitter) numOfWords++;
        lenOfStr++;
    }
    std::cout <<"numOfWords: " <<  numOfWords <<std::endl;
     std::cout <<"lenOfStr: " <<  lenOfStr <<std::endl;
    char** words=new char* [numOfWords];
    int* lenOfEachWord=new int[numOfWords];

    int lenth=0,wordNum=0;
    for (int i=0;i<lenOfStr;i++){
        if (Sentence[i]==splitter) {
            lenOfEachWord[wordNum]=lenth;
            lenth=0;
            wordNum++;
        }
        else lenth++;
    }
    // be care with the boundary 
    if (lenth >= 0)
    {
        lenOfEachWord[wordNum]=lenth;
        wordNum++;
    }
    for(int i =0 ; i< numOfWords; i++)
    {
        std::cout << lenOfEachWord[i] << " ";
    }
    std::cout<<std::endl;
    for (int word=0;word<numOfWords;word++){
        int lenth=lenOfEachWord[word];
        words[word]=new char[lenth];
    }
    int word=0;
    int chr=0;
    while (chr<lenOfStr){
        if (Sentence[chr] == splitter )
        {
            chr++;
            continue;
        }
        std::cout << word << endl;
        for (int i=0 ;i<lenOfEachWord[word];i++){
            words[word][i]=Sentence[chr];
            std::cout << word << " " << i << " " << chr<< " "<< Sentence[chr]<<endl;
            chr++;
        }
        word++;
    }
    for (int i=0;i<numOfWords;i++){
        for (int j=0;j<lenOfEachWord[i];j++){
            cout<<words[i][j];
        }
        cout<<endl;
    }
    for (int i=0;i<numOfWords;i++){
        delete[] words[i];
    }
    delete[] words;


    return 0;
}