c ++我的char *数组被最后添加的元素覆盖

时间:2017-02-10 05:58:36

标签: c++ pointers char c-strings

你好,我在这个项目上遇到了一些麻烦。假设从文本文件中获取一个句子,然后将其添加到char * array []。我在switch语句中遇到声明部分时遇到问题。当一个单词长度为3个字符时,它会用最后一个适合的元素替换数组中的所有元素。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int length(const char *a){
    int counter=0;
    while(a[counter]!= NULL){
        counter++;
    }
    return counter;
}

int main() {
    ifstream file;
    file.open("C:\\Users\\casha\\Desktop\\group_project1\\message.txt");

    string line;
    while(!file.eof()){
        getline(file,line);
    }
    const char* message = line.c_str();
    const char *words[9];
    words[0]= line.substr(0,4).c_str();

    int pos = 0;
    int counter = 0;
    int wordscounter=0;
    while(pos<=length(message)){
        if(message[pos]== ' ' || message[pos]== NULL){
            switch(counter){
                case 3  :
                    words[wordscounter] = line.substr(pos-    counter,counter).c_str();
                    wordscounter++;
                    break;
                case 4  :
                    words[wordscounter] = line.substr(pos-counter,counter).c_str();
                    wordscounter++;
                    break;
                case 5  :
                     words[wordscounter] = line.substr(pos-counter,counter).c_str();
                    wordscounter++;
                    break;
             }
            counter=0;
            pos++;
        }
        else{
            pos++;
            counter++;
        }
    }

    for(int x=0;x<=8;x++){
        cout << words[x] << endl;
    }

应该像这样输出

 The
 quick
 brown
 fox
 jumps
 over
 the
 lazy
 dog

但相反产生:

dog
jumps
jumps
dog
jumps
lazy
dog
lazy
dog

我读了一些关于未分配内存的内容,我是c ++的新手,所以任何帮助都会受到赞赏 提前致谢 ! &LT; 3

编辑 -

如果我像这样手动将值分配给数组

words[3] = line.substr(3,5).c_str();

然后它将打印正确的输出。 那么我使用这个方法和我的switch语句之间有什么区别,它的分配是什么???

1 个答案:

答案 0 :(得分:0)

在你写的评论中写道:

  

那么我如何在不留下悬挂在语句之外的字符串的情况下分配给char*数组。

更改

const char *words[9];

std::vector<std::string>> words;

而不是使用

words[0] = line.substr(0,4).c_str();;

使用

words.push_back(line.substr(0,4));

在您正在使用的其他地方进行类似的更改

words[wordscounter] = line.substr(pos-counter,counter).c_str();

他们可以是:

words.push_back(line.substr(pos-counter,counter));