0

这是我在 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;
}
4

3 回答 3

4

add_new_account()包含字符串的成员之外struct都是悬空指针,因为它们指向该函数本地变量的地址。这将地址分配First_nameadd_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()写入的空终止字符。

于 2013-04-02T13:57:25.763 回答
1

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

add_account.F_name=First_name;

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

于 2013-04-02T13:58:12.910 回答
1

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

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);
    ...
于 2013-04-02T14:21:14.327 回答