c中的打印结构值

时间:2013-04-02 13:54:05

标签: c

这是我在c

中的代码

内部add_new_account正在使用scanf。

当我在main函数中打印它时,它会输出一个我键入的不同值。

请有人帮我解决这个问题。

感谢您的帮助

struct account
{
char* F_name;
char* L_name;
int IC_No;
char* address;
char* e_address;
int c_number;
};

void add_new_account(struct account A[]){
int y=0;
char First_name[20],Last_name[20],addres[20],email[20];
int IC,number;
struct account add_account;
printf("First name    :");
scanf("%s",First_name);
add_account.F_name=First_name;
printf("Last name     :");
scanf("%s",Last_name);
add_account.L_name = Last_name;
printf("IC No.        :");
scanf("%d",&IC);
add_account.IC_No = IC;
printf("Address       :");
scanf("%s",addres);
add_account.address = addres;
printf("Email address :");
scanf("%s",email);
add_account.e_address = email;
printf("Contact number:");
scanf("%d",&number);
add_account.c_number = number;
A[y] = add_account;
}
int main(){
struct account A[20];
int y=0;
login();
add_new_account(&A);
printf("First name    :");
printf("%c\n",A[y].F_name);
printf("Last name     :");
printf("%s\n",A[y].L_name);
printf("IC No.        :");
printf("%d\n",A[y].IC_No);
printf("Address       :");
printf("%s\n",A[y].address);
printf("Email address :");
printf("%s\n",A[y].e_address);
printf("Contact number:");
printf("%d\n",A[y].c_number);
scanf("%d",&y);
return 0;
}

3 个答案:

答案 0 :(得分:4)

add_new_account()之外,struct包含字符串的成员都是悬空指针,因为它们指向该函数本地变量的地址。这会将First_name的地址指定为add_account.F_name

add_account.F_name=First_name;

它确实执行了一个副本。您需要复制局部变量的内容,以使其在函数外部可用。使用strcpy()的示例:

add_account.F_name = malloc(strlen(First_name) + 1);
if (add_account.F_name)
{
    strcpy(add_account.F_name);
}

代替使用malloc(),替代方法是在struct中使用固定大小的数组,因为代码已经使用固定大小的数组进行读取。如果您选择使用malloc(),请记住free() malloc() d。

另外,为了防止缓冲区溢出,请指定要在scanf()调用中作为格式说明符的一部分读取的最大字符数:

scanf("%19s", First_name);

其中最大字符数必须小于正在填充的数组中元素的最大数量,另一个元素用于scanf()写入的空终止字符。

答案 1 :(得分:1)

例如,当您使用scanf("%s",First_name);读取字符串时,您正在将值读入您在函数堆栈中指定的数组中。
之后,您正在分配

add_account.F_name=First_name;

这样,您将从堆栈中将数组的地址分配给指针。当您的函数返回时,此地址和值将丢失。您需要使用malloc分配内存,然后使用strncpy将输入复制到指针。

答案 2 :(得分:1)

尝试这样的struct并省略函数中局部变量的使用。

typedef struct
{
   char F_name[20];
   char L_name[20];
   int IC_No;
   char address[20];
   char e_address[20];
   int c_number;
} account;

void add_new_account(account *A)
{
   printf("First name    :");
   scanf("%s", A->F_name);
   ...

它看起来不是更好,更具可读性吗?

您还必须更改main()代码:

int main(){
    account A[20];
    int y=0;
    login();
    add_new_account(&A[y]);
    printf("First name    :");
    printf("%c\n",A[y].F_name);
    ...