存储char数组值错误(c ++)

时间:2016-11-12 08:12:25

标签: c++

我正在尝试制作管理学生列表的c ++程序,但从一开始就遇到了错误。这是我的计划:

#include<iostream>
#include<string.h>
using namespace std;
struct  Candidate
{
  char id[5];
char fullname[30];
int reading, listening,total;
};
int main ()

{
struct Candidate can[100];
int n=0;
do {
    cout << "Input number of candidate:";
    cin >> n;
    if (n <= 0 || n>=50)
        cout << "Candidate number must be between 0 and 50:\n";
} while (n <= 0 || n>=50);
for (int i = 0; i < n; i++)
{
    cout << "Input information for candidate number " << i + 1 << endl;
    cin.ignore(32323, '\n');
    cout << "Input ID(only 5 character):";
    gets(can[i].id);
    cout << "Input full name:";
    gets(can[i].fullname);

    do {
        cout << "Input reading mark:";
        cin >> can[i].reading;
        if(can[i].reading < 5 || can[i].reading>495)
            cout<<"Your reading mark is not between 5 and 495\n";
    } while (can[i].reading < 5 || can[i].reading>495);
    do {
        cout << "Input listening mark:";
        cin >> can[i].listening;
        if(can[i].listening < 5 || can[i].listening>495)
            cout<<"Your listening mark is not between 5 and 495\n";
    } while (can[i].listening < 5 || can[i].listening>495);


    can[i].total = can[i].reading + can[i].listening;
}
cout << endl << can[0].id<<endl;
}

所以我得到了这样的输出:

Input number of candidate:1


Input information for candidate number 1


Input ID(only 5 character):EW2RR


Input full name:Test1


Input reading mark:344


Input listening mark:233

EW2RRTest1 

似乎fullname的值不断写入ID。我已经尝试了很多方法来修复,但无法弄清楚。有人有线索吗?

2 个答案:

答案 0 :(得分:0)

您需要在每个字符串的末尾添加一个终端'\0'字符。

当ID打印出来时,代码(cout)不会停止,直到NULL为止。

这称为超越缓冲区。

答案 1 :(得分:0)

如果你的字符串长度为N,那么在每个字符串中,你必须拥有大小至少为N + 1的字符数组,用于&#39; \ 0&#39;这表示字符串在此结束,以便cout停止打印。

在您的情况下,您声明了大小为5的char数组,并且您将所有5个字符填充为#39; \ 0&#39;放在别的地方。请注意&#34; id&#34;和&#34;全名&#34;彼此相邻,所以我最好的猜测就是放置&#39; \ 0&#39;当你扫描&#34; ID&#34;应该是&#34; id [5]&#34;到&#34;全名[0]&#34;,然后当你扫描&#34; FULLNAME&#34; ,它取代了这个&#39; \ 0&#39; ,所以&#34; id&#34;没有终止点,必须使用&#34; fullname&#34;的终止点。这就是为什么看起来全名已附加到id。请注意,这不是默认行为,程序在其他计算机上的行为可能不同。

另外,gets()是一个破碎的函数,如果你之前使用cin或scanf,你应该首先通过调用

来刷新你的stdin
fflush(stdin);

在使用gets()之前,因为有时&#39; \ n&#39;留在stdin但在你的情况下,这是由

照顾
cin.ignore(32323, '\n');

保罗鲁尼所说的使用fgets()更为可取。我自己也有很多问题。

快乐编码!!