您好我想将用户的输入复制到结构中定义的char数组中。我真不知道怎么做。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
struct employee
{
char firstname[11];
char lastname[11];
char number[11];
int salary;
}
int i;
int nemps;
const int maxemps = 5;
struct employee* emps[maxemps];
printf("How many employees do you want to store?(max:5): ");
scanf("%d", nemps);
for (i = 0; i < nemps; i++)
{
printf("Employee 1./nLast name:");
scanf("....")// Read the string and copy it into char lastname[]
}
}
答案 0 :(得分:3)
首先关闭struct employee* emps[maxemps];
创建一个指针数组,指向struct employee ,数组大小为 maxemps 。你实际上没有在内存中为实际的结构留出任何空间,只是指向它们的指针。要为您的结构动态分配堆上的空间以便以有意义的方式使用它们,您需要循环调用malloc()
,如下所示:
for (i = 0; i < maxemps; i++) {
emps[i] = malloc(sizeof(struct employee));
}
您还需要在程序结束时使用类似的循环,每个指针free()
。
接下来,当您从用户那里获得输入时,您确实希望使用fgets()
而不是scanf()
,因为fgets()
允许您指定要读取的字符数,这样您就可以防止目标缓冲区溢出。
如果您想在不使用指针的情况下使用单个struct employee
,则可以通过在堆栈上声明一个或多个struct employee
然后使用.
成员访问运算符来完成此操作。如下:
struct employee emp;
fgets(emp.lastname, sizeof(emp.lastname), stdin);
我在你的代码中发现了一些错误。有关评论的工作样本,请参阅this link。
答案 1 :(得分:2)
你只需要:
scanf("%10s", (emps[i])->last_name);
此处"%10s"
表示最大长度为10的字符串,它将字符串加载到last_name。
在C中,字符串表示为char数组,其中'\0'
为结束。
如果用户输入超过10:http://en.wikipedia.org/wiki/Scanf#Security,则此处使用scanf
容易受到缓冲区攻击,因此您需要为格式指定最大长度。