您已经有了一个很好的答案,但您还必须涵盖几个额外的点,以便对您的输入程序有信心。首先,您必须验证每个用户输入,并且必须在下一次输入之前清空 stdin 的任何其他字符。问问你自己,如果你输入"Ninety One" 换成Age,会发生什么?清除stdin 可以通过一个简单的循环继续您的C-stye 输入或使用std::cin.ignore()(如果使用iostream)来完成。
例如,当您循环收集员工数据时,您必须强制用户为每个变量输入有效的输入,然后才能进入下一个商店,例如
for (int i = 0; i < n; i++) { /* loop for input of n empoloyees */
struct Employee emp;
puts ("\nEnter employee data :");
for (;;) { /* loop continually until valid input received */
fputs ("\n Name ?: ", stdout); /* prompt (fputs for \n control) */
int rtn = scanf("%s", emp.name); /* save return from scanf */
if (rtn == EOF) { /* check for manual EOF */
puts ("(user canceled input)");
return 0;
} /* remove any extraneous characters from stdin */
for (char c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
if (rtn == 1) /* if good input break loop */
break;
}
您必须在处理数字输入时添加额外的检查以涵盖 匹配失败 情况,例如
for (;;) { /* ditto for Age, but note the additional validation required */
fputs (" Age ?: ", stdout);
int rtn = scanf ("%d", &emp.age);
if (rtn == EOF) {
puts ("(user canceled input)");
return 0;
}
for (char c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
if (rtn == 1)
break;
fputs ("error: invalid integer input.\n", stderr);
}
如果您要求输入的数字在特定范围内,您可以添加额外的检查,例如 if (emp.age < 16 || emp.age > 80) 处理无效年龄的错误。
对于输出,您不需要多次调用printf(或std::cout)——一个就可以了,例如
/* No return, you must pass number of elements as second parameter */
void displayEmployee (struct Employee *arr, int n)
{
puts ("\nEmployee data:"); /* no conversion, just use puts */
for (int i=0; i < n; i++) /* only 1 printf needed */
printf ("\n Name: %s\n Surname: %s\n Age: %d\n Salary: %.2f\n",
arr[i].name, arr[i].surname, arr[i].age, arr[i].salary);
}
还请注意,没有理由从displayEmployee 返回值,它只是一个输出函数,没有任何返回来指示函数内操作的成功或失败。
总而言之,你可以这样做:
#include <cstdio>
#define MAXN 30
struct Employee {
char name[MAXN];
char surname[MAXN];
int age;
float salary;
};
/* No return, you must pass number of elements as second parameter */
void displayEmployee (struct Employee *arr, int n)
{
puts ("\nEmployee data:"); /* no conversion, just use puts */
for (int i=0; i < n; i++) /* only 1 printf needed */
printf ("\n Name: %s\n Surname: %s\n Age: %d\n Salary: %.2f\n",
arr[i].name, arr[i].surname, arr[i].age, arr[i].salary);
}
int main()
{
int n = 0;
fputs ("\nEnter employee number : ", stdout);
if (scanf ("%d", &n) != 1) { /* validate every input */
fputs ("error: invalid integer input.\n", stderr);
return 1;
}
struct Employee *eArr = new struct Employee[n]; /* allocate */
for (int i = 0; i < n; i++) { /* loop for input of n empoloyees */
struct Employee emp;
puts ("\nEnter employee data :");
for (;;) { /* loop continually until valid input received */
fputs ("\n Name ?: ", stdout); /* prompt (fputs for \n control) */
int rtn = scanf("%s", emp.name); /* save return from scanf */
if (rtn == EOF) { /* check for manual EOF */
puts ("(user canceled input)");
return 0;
} /* remove any extraneous characters from stdin */
for (char c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
if (rtn == 1) /* if good input break loop */
break;
}
for (;;) { /* ditto for Surname */
fputs (" Surname ?: ", stdout);
int rtn = scanf("%s", emp.surname);
if (rtn == EOF) {
puts ("(user canceled input)");
return 0;
}
for (char c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
if (rtn == 1)
break;
}
for (;;) { /* ditto for Age, but note the additional validation required */
fputs (" Age ?: ", stdout);
int rtn = scanf ("%d", &emp.age);
if (rtn == EOF) {
puts ("(user canceled input)");
return 0;
}
for (char c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
if (rtn == 1)
break;
fputs ("error: invalid integer input.\n", stderr);
}
for (;;) { /* ditto for Salary with same note */
fputs (" Salary ?: ", stdout);
int rtn = scanf ("%f", &emp.salary);
if (rtn == EOF) {
puts ("(user canceled input)");
return 0;
}
for (char c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
if (rtn == 1)
break;
fputs ("error: invalid floating-point input.\n", stderr);
}
eArr[i] = emp; /* simply assign struct to element */
}
displayEmployee(eArr, n);
return 0;
}
使用/输出示例
$ ./bin/empstruct
Enter employee number : 3
Enter employee data :
Name ?: Mickey
Surname ?: Mouse
Age ?: 91
Salary ?: 88.82
Enter employee data :
Name ?: Minnie
Surname ?: Mouse
Age ?: 88
Salary ?: 93.25
Enter employee data :
Name ?: Goofy
Surname ?: Dog
Age ?: 85
Salary ?: Bone and Treats
error: invalid floating-point input.
Salary ?: .25
Employee data:
Name: Mickey
Surname: Mouse
Age: 91
Salary: 88.82
Name: Minnie
Surname: Mouse
Age: 88
Salary: 93.25
Name: Goofy
Surname: Dog
Age: 85
Salary: 0.25
尝试使用您当前的代码为Age 或Salary 输入无效的输入,然后看看会发生什么(当您这样做时,请将您的手指悬停在 Ctrl+c 上...或查看哪个输入似乎被跳过)
此外,您应该选择 C 或 C++。您所拥有的是一个使用new 而不是malloc 进行分配的C 程序。如果你用new 替换你的分配struct Employee *eArr = malloc (n * sizeof *eArr); 那么你有一个纯C 程序。语言混用没有什么不好的,但就是不好看。
如果您还有其他问题,请告诉我。