2011-08-31 78 views
0

我想獲取輸入數據並使用結構打印它。當我運行這個代碼時,它沒有爲姓輸入。它直接要求輸入名字的輸入。有人可以幫我弄這個嗎。謝謝。問題與獲取()

address.c 

typedef struct 
{ 
    char lname[25]; 
    char fname[20]; 
    char address[20]; 
    char phonenumber[20]; 
}addressbook; 

addressbook a; 
int main() 
{ 
printf("enter details:\n"); 
    printf("enter lastname:\n"); 
    gets(a.lastname); 
    printf("enter firstname:\n"); 
    gets(a.firstname); 
    printf("enter address:\n"); 
    gets(a.address); 
    printf("enter phone number:\n"); 
    gets(a.phonenumber); 
    printf("lastname:%s\n",a.lastname); 
    printf("firstname: %s\n", a.firstname); 
    printf("address:%s\n", a.address); 
    printf("phone number:%s\n", a.phonenumber); 
} 

當我運行它時,它不會等待輸入姓氏。它直接進入firstname。

+8

只是一個注意:['gets()'是危險的](http://stackoverflow.com/questions/2843073/warninggets-function-is-dangerous) –

+1

gets()已被棄用一段時間。使用getline()來代替。爲了避免溢出 – CoolBeans

+3

總是使用'fgets'而不是'gets',以避免溢出 –

回答

0

該代碼甚至不會編譯因爲它的立場,生產(在我的環境):

[email protected]:~$ gcc -Wall -Wextra -o qq qq.c 
qq.c: In function ‘main’: 
qq.c:12:2: warning: implicit declaration of function ‘printf’ 
qq.c:12:2: warning: incompatible implicit declaration of built-in function ‘printf’ 
qq.c:14:4: warning: implicit declaration of function ‘gets’ 
qq.c:14:10: error: ‘addressbook’ has no member named ‘lastname’ 
qq.c:16:10: error: ‘addressbook’ has no member named ‘firstname’ 
qq.c:21:28: error: ‘addressbook’ has no member named ‘lastname’ 
qq.c:22:31: error: ‘addressbook’ has no member named ‘firstname’ 
qq.c:25:1: warning: control reaches end of non-void function 

你應該總是(至少在初期)高警告級別編譯並注意什麼編譯器告訴你:

  • 你應該包括stdio.h如果你打算使用printfgets
  • 您應該在結構中使用一致的字段名稱。
  • 你應該從非無效函數中返回一些東西(從技術上講,這在標準的後期版本中是不必要的,但它對於可移植性來說仍然是一個好主意)。

另外,你可能要考慮以下幾點:

  • int main()不是的main函數的兩個典型形式之一。雖然標準允許用於實現定義的額外1,但對於這種特定情況的「正確」1將是int main (void)
  • gets危險功能,因爲沒有辦法防止緩衝區溢出,使您的代碼不安全。例如,如果我爲我的名字輸入了一千個字符,它可能會在堆棧上覆蓋巨大的會計信息塊(例如返回地址),從而導致程序崩潰。你可以找到一個更安全的輸入功能here

製作的這些變化,你最終會喜歡的東西:

#include <stdio.h> 

typedef struct { 
    char lastname[25]; 
    char firstname[20]; 
    char address[20]; 
    char phonenumber[20]; 
}addressbook; 

addressbook a; 
int main (void) { 
    printf("enter details:\n"); 

    printf("enter lastname:\n"); 
    gets(a.lastname); 

    printf("enter firstname:\n"); 
    gets(a.firstname); 

    printf("enter address:\n"); 
    gets(a.address); 

    printf("enter phone number:\n"); 
    gets(a.phonenumber); 

    printf("lastname:%s\n",a.lastname); 
    printf("firstname: %s\n", a.firstname); 
    printf("address:%s\n", a.address); 
    printf("phone number:%s\n", a.phonenumber); 

    return 0; 
} 

其中編譯和運行正常,但它仍然有嚴重的緩衝區溢出漏洞。如果你想解決這個問題,你可以參考我給出的鏈接。