在for循环中读取struct类型中的变量

时间:2014-02-04 13:18:22

标签: c++ struct

我写了一段代码,我应该从for循环中读取变量:

#include <iostream>
using namespace std;

#define NumOfStudents 100
#define NumOfCourses 15

struct Student{
  int stdnum, FieldCode, age;
  double average, res[NumOfCourses];
  char name[20];          //First and Last name length                                                                                                                          
};

int main(){
  struct Student students[NumOfStudents];
  int i;
  cout << "\tNAME || STUDENT-NUMBER || FIELD-CODE || AGE";
  for(i=0; i<NumOfStudents; i++){
    cout << "\nSTUDENT #" << i+1 << ": ";
    cin >> students[i].name[20] >> students[i].stdnum >> students[i].FieldCode >> students[i].age;                                                                            
    //    cin >> students[i].name[20];                                                                                                                                          
  }
}

编辑: 输出是:

./st 
    NAME || STUDENT-NUMBER || FIELD-CODE || AGE
STUDENT #1: test

STUDENT #2: 
STUDENT #3: 
STUDENT #4:
.
.
.
STUDENT #100:

我可以输入第一个学生的名字,循环不能正常工作 有什么问题?

6 个答案:

答案 0 :(得分:7)

cin >> students[i].name[20];

它不应该是20的数组。这意味着您输入的第一个字符存储在索引20th位置,该位置不正确,并且可能导致未定义的行为,因为name数组仅从0索引到19

而应该是cin >> students[i].name,它写入数组name

的基址

答案 1 :(得分:5)

我认为你必须写

cin >> students[i].name

由于它是一维数组,因此不应使用subscript来获取输入。

答案 2 :(得分:1)

cin >> students[i].name[20]

这部分是错误的。此命令从标准输入读取一个字符,并将其存储在name中的第20个位置(即在数组name之后的字节中)。你想使用:

cin >> students[i].name >> ...

答案 3 :(得分:1)

符合“cin&gt;&gt; students [i] .name [20]”。

你不能使用name [20]作为字符串的输入变量,因为它指向索引为20的字符,在你的情况下也不存在,因为char name [20]存储在索引0-19中。

格式正确:

CIN&GT;&GT;学生[I]。名称;

读取字符串或名称作为字符串。

答案 4 :(得分:1)

首先,您需要在没有索引的情况下使用students[i].name。您的语法会尝试将它从终端读取的单个字符插入char数组的末尾,从而弄乱指针(请注意,您应该确保输入被截断)。

其次,您应该为每个学生输入所有输入参数,不能只是插入他们的名字。所以输入将是:

$ ./st
STUDENT #1: TestName 3456 1 15

如果这不是预期的行为,您可能想要做多个cin >> variable州同事。

答案 5 :(得分:1)

你能说得更清楚吗?输入第一个名字后,您是否无法输入详细信息?或者是在执行整个操作之前退出循环?

在你的代码中,有一个问题,我想

students[i].name[20]

这里只读取一个字符。这应该用cin替换

students[i].name

此外,如果您在第一次迭代后无法输入详细信息,请尝试使用fflush()或setbuf()来清除输入缓冲区。

此外,如果您必须读取带空格的字符串,请尝试使用cin.getline()或gets()。这些格式可在网上找到。

谢谢