为什么我的struct只存储最后一个字符串而不是每个字符串?

Ade*_*war 0 c++ string struct function

所以我做了一个结构,我在一个函数内部调用它,但事情进展不顺利......

结构如下......

结构功能

struct Line {
  private:
    int lineNumber;
    char lineString[];
  public:
    bool set(int n,const char* str);
    void display() const;
};
Run Code Online (Sandbox Code Playgroud)

一切都在函数内正常工作,我存储了lineN和lineS然后将它们发送到名为... bool set(int n,const char*str)的函数中 ; (从上面)使用名为storage的结构.在第一个while循环之后,我使用了一个名为display的函数来显示lol.

设定功能

void List::set(int no){
Line storage[no];
    int i =0, x;
    while (i!=no){
        cout << "Enter line number : ";
        cin  >> lineN;
        cout << "Enter line string : ";
        cin  >> lineS;
        x = storage[i].set(lineN, lineS);
        if (x == 1){
            i++;
    }
}
i=0;
while (i!=no){
    storage[i].display();
    i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

除了检查"true/false"之外,True是任何正整数,False是0或负整数.我使用以下bool来存储数据(如果它们是真的)存储结构中...我认为问题出在这里但我似乎无法绕过它...

BOOL FUNCTION

bool Line::set(int n, const char* str){
    int i;
    if (n >= 1){
        lineNumber = n;
        for (i=0;i<6;i++){
            lineString[i]=str[i];
        }
        lineString[6]='\0';
        return true;
    }
else if (n <= 0)
    return false;
}
Run Code Online (Sandbox Code Playgroud)

显示功能

void Line::display()const{
cout << "LINE: " << lineNumber << " STRING: " << lineString << endl;
}
Run Code Online (Sandbox Code Playgroud)

然而,当我点击运行程序并让我说我输入3次...行号和行字符串...我的结果如下...

INPUT:

Enter line number : 3
Enter line string : ABCDEF
Enter line number : 6
Enter line string : YYUTXL
Enter line number : 8
Enter line string : XYXYXX
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

LINE: 3 STRING: 
LINE: 6 STRING: 
LINE: 8 STRING: XYXYXX
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么不在最后一个字符串之前存储在字符串中,如果我这样做2次,只有第二个/最后一个将在其中包含字符串.我正确存储它我不是吗?

输出我希望:

LINE: 3 STRING: ABCDEF
LINE: 6 STRING: YYUTXL
LINE: 8 STRING: XYXYXX
Run Code Online (Sandbox Code Playgroud)

Gor*_*bot 5

麻烦的是这是创建一个空数组:

char lineString[];
Run Code Online (Sandbox Code Playgroud)

你并没有告诉它有多大,所以它的长度是零字节.因此,您尝试保存六个字符的字符串会覆盖内存.

你真的应该使用std::string,但如果你不想,你至少需要说出你的字符串有多大:

char lineString[50]; // save up to 49 characters + NULL.
Run Code Online (Sandbox Code Playgroud)