2013-04-02 48 views
0

這是我的代碼cc中的打印結構值

add_new_account裏面正在使用scanf。

當我打印出來的主要功能,它走出了一條不同的值,我的重點。

有人可以幫助我解決這個問題吧。

感謝您幫助的struct方含串add_new_account()成員

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

外都懸擺指針,因爲它們指向的局部變量該函數的地址。這就賦予的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()

+0

我能知道如何複製呢? –

+0

@郭雙禎,更新了答案。 – hmjd

+0

它不工作 只有內部結構的字符串不能打印結果正確 結果如下 –

1

例如,當您使用scanf("%s",First_name);以字符串形式讀取數據時,您正在將數值讀入您在函數堆棧中分配的數組中。
之後,你要分配

add_account.F_name=First_name; 

這個,你給你的指針分配從堆棧中數組的地址。當你的函數返回時,這個地址和值將會丟失。您需要使用malloc分配內存,然後使用strncpy將輸入複製到指針。

+0

感謝您的幫助^^ –

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); 
    ... 

它看起來更好,更具可讀性嗎?

您還必須更改主()代碼:

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

您必須與main()代碼一起玩...您是使用20個帳戶還是隻使用第一個,而20是一些虛擬數字? –

+0

感謝您的幫助^^ –