字符显示

时间:2014-05-04 17:16:29

标签: c++ console

我知道这可能是一个如此奇怪的问题,但它在几天前引起了我的注意。我的同意是显示学生的信息并使用STRUCT类型更新它们。这是我的作品:

#include <iostream>

using namespace std;

struct DATE
{
int day;
int month;
int year;
};

struct STUDENT{
char ID[8];
char name[50];
DATE birthday;
char address[100];
float Math;
float English;
float CS;
};


void inputClass(STUDENT* &list, int &n)
{
cout << "Please enter the number of students: ";
cin >> n;
list = new STUDENT[n+1];
for(int i=1; i<=n; i++)
{
cout << "Please enter the info of student " << i << endl;

cout << "ID: "; 
cin >> (&list[i]) -> ID; //the same with "list[i].ID"
fflush(stdin);

cout << "Name: ";
cin >> (&list[i]) -> name;
fflush(stdin);

cout << "Date of Birth\n";
cout << "Day: ";
cin >> (&list[i]) -> birthday.day;
fflush(stdin);
cout << "Month: ";
cin >> (&list[i]) -> birthday.month;
fflush(stdin);
cout << "Year: ";
cin >> (&list[i]) -> birthday.year;
fflush(stdin);

cout << "Address: ";
cin >> (&list[i]) -> address;
fflush(stdin);

cout << "Math result: ";
cin >> (&list[i]) -> Math;
fflush(stdin);

cout << "English result: ";
cin >> (&list[i]) -> English;
fflush(stdin);

cout << "CS result: ";
cin >> (&list[i]) -> CS;
fflush(stdin);

cout << "************* Next Student *************\n" ;
}
}

void updateScore(STUDENT* list, int n)
{
cout << "Who do you want to update?" << endl;
cout << "Ordinal Number(s): ";
cin >> n;
//Display outdated results
cout << "Student's Name: " << (&list[n])-> name << endl;
cout << "*********** Current Results ***********" << endl;
cout << "Math: " << (&list[n]) -> Math << endl;
cout << "English: " << (&list[n]) -> English << endl;
cout << "CS: " << (&list[n]) -> CS << endl;
//Update results
cout << "Please update the results" << endl;
cout << "Math result: ";
cin >> (&list[n]) -> Math;
fflush(stdin);

cout << "English result: ";
cin >> (&list[n]) -> English;
fflush(stdin);

cout << "CS result: ";
cin >> (&list[]) -> CS;
fflush(stdin);


}

void main()
{
STUDENT* list;
int n;
inputClass(list, n);

updateScore(list, n);
}

在“//显示过期结果”部分中,我使用“cout”根据他/她的序数打印出相关学生的姓名。但是,让我们说我想得到像“约翰史密斯”这样的全名。然而,我得到的只是“约翰”。有没有办法可以获得所有角色?

非常感谢你的帮助,抱歉我的英语不好,我是来自越南的学生。

2 个答案:

答案 0 :(得分:1)

使用std::getline标题中的<string>std::string变量,而不是>>和原始字符数组。

  • >>读取输入的空格分隔的

  • 原始字符数组不会调整到所需的长度,并且在缓冲区溢出时存在未定义的行为风险。


顺便说一下,许多/大多数程序员发现所有大写都是一个眼睛;它伤害了眼睛。

此外,所有大写都是按照惯例(在C和C ++中)保留给宏名称。

答案 1 :(得分:1)

如前所述,您应该使用std :: getline(请参阅此question)。

我假设您正在使用IDE,它通常会为我们的用户修复很多东西,但这可能会让您的代码在其他编译器中无法编译,所以有些事情你应该修复能够在任何地方编译你的代码:

如果您要添加必要的包含,请务必注意。 stdin和fflush缺少include语句。你应该添加:

#include <cstdio>

另外,main应该返回一个int,所以它应该是

int main(int argc, char* argv[]){ /*Although you can usually omit the parameters*/
  // Code

  return 0;
}

顺便说一句,就像旁注一样,你忘记了下标:

cout << "CS result: ";
cin >> (&list[]) -> CS;