将字符串复制到char数组中

时间:2010-12-18 06:57:35

标签: c

您好我想将用户的输入复制到结构中定义的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[]
    }

}

2 个答案:

答案 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);

UPDATE2

我在你的代码中发现了一些错误。有关评论的工作样本,请参阅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容易受到缓冲区攻击,因此您需要为格式指定最大长度。