【发布时间】:2014-09-03 21:56:58
【问题描述】:
我有以下代码。在结构定义中,我尝试让用户输入员工的名字和姓氏。但是当我运行这个exe时,它会在输入标题后退出。有什么建议么?
#include<stdio.h>
#include<string.h>
#define NUMEMPS 10
struct Employee {
char *firstname;
char *lastname;
char *title;
int salary;
};
int main()
{
struct Employee* stuff = malloc(NUMEMPS* sizeof *stuff);
int n,i;
for (n=0; n<NUMEMPS;n++)
{
printf("Please enter number %d Employee's Last name:", n);
fflush(stdout);
gets(stuff[n].lastname);
if (strlen(stuff[n].lastname) == 0)
break;
printf("Please enter number %d Employee's first name:", n);
fflush(stdout);
gets(stuff[n].firstname);
printf("Please enter number %d Employee's title:", n);
fflush(stdout);
gets(stuff[n].title);
printf("Please enter number %d Employee's salary:", n);
fflush(stdout);
scanf("%d", &stuff[n].salary);
getchar();
}
for (i = 0;i<n;i++)
{
printf("{%s,%s,%s,%d}\n",
stuff[i].lastname,
stuff[i].firstname,
stuff[i].title,
stuff[i].salary);
}
return 0;
}
【问题讨论】:
-
不要使用
gets();它不再是标准 C 的一部分,并且无论任何其他问题如何,都无法安全使用。请改用fgets()或getline(),记住这两者都在结果字符串中包含分隔符(换行符),而gets()将其省略。并检查每个输入操作的结果。 -
@JonathanLeffler: [pubs.opengroup.org/onlinepubs/9699919799/functions/…(
getline) 由 POSIX 定义,但不是由 C 标准定义。它可能并不存在于所有系统上——或者可能存在同名的不同函数。 -
@KeithThompson:是的;这就是为什么我把
fgets()放在第一位的原因,尽管我承认我没有像往常一样包含 URL,也没有明确地将getline()称为仅限 POSIX。 -
关于这一行: struct Employee* stuff = malloc(NUMEMPS* sizeof *stuff);这仅为 10 个指针分配空间,而不是 10 个 'struct Employee' 代码中还有一些其他问题,例如将员工数组放入堆栈,但这是第一个/主要问题。
-
字符串的读取没有包含字符串的地方。 IE。每个员工结构中的每个字符串指针都需要一个 malloc 来预先分配一些内存来保存字符串,或者需要修改结构字段以定义一个(对于最长条目而言足够大)字符数组。自然,如果使用 malloc 方法,那么所有这些内存分配都需要被释放。
标签: c pointers struct char gets