这是我在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;
}
答案 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);
...