我正在尝试制作管理学生列表的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。我已经尝试了很多方法来修复,但无法弄清楚。有人有线索吗?
答案 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,你应该首先通过调用
来刷新你的stdinfflush(stdin);
在使用gets()之前,因为有时&#39; \ n&#39;留在stdin但在你的情况下,这是由
照顾cin.ignore(32323, '\n');
保罗鲁尼所说的使用fgets()更为可取。我自己也有很多问题。
快乐编码!!