2012-02-03 56 views
1

在下面的代碼當我想輸入第二個學生或> 2學生的記錄..編譯器跳過名稱爲輸入和輸入爲類和年齡..什麼問題請幫助我?使用獲取功能輸入

#include <stdio.h> 
#include <conio.h> 

struct Student 
{ 

char Name[16]; 
char Class[16]; 
int age ; 

}; 

void main() 

{ 

struct Student a[5] ; 

for(int i=0 ; i<5 ; i++) 
{ 
printf("\n Enter Name :"); 
gets(a[i].Name); 
printf("\n Enter Class :"); 
gets(a[i].Class); 
printf("\n Enter Age : "); 
scanf("%d" , & a[i].age); 
} 

getch(); 
} 

回答

3

這個問題很普遍。試試這個:

scanf("%d ", &a[i].age); 
     ^<--- This space will make scanf eat the remaining blanks 

有是C常見問題解答這個問題:

輔助Notes:

+0

注**不使用'gets' ** *非常重要*。並且'gets'已被棄用,並且在最近的C或Posix標準中被刪除(或已棄用) – 2012-02-03 19:26:14

+0

如何在上述情況下通過fgets獲得輸入? – 2012-02-03 19:35:52

+1

@MUHAMMADFaysal查閱手冊。如果我只是告訴你,它不會教你任何東西。 – cnicutar 2012-02-03 19:38:27

1

這是scanf。當它後面按ENTER時,換行符完成下一個呼叫gets

若要解決此問題,您可以在循環的末尾添加一個getchar,在scanf之後,這將消耗換行符。

for(int i=0 ; i<5 ; i++) 
{ 
    printf("\n Enter Name :"); 
    gets(a[i].Name); 
    printf("\n Enter Class :"); 
    gets(a[i].Class); 
    printf("\n Enter Age : "); 
    scanf("%d" , & a[i].age); 
    getchar(); 
} 
3

首先,從不使用gets。無法告訴它緩衝區有多大,因此它會愉快地寫入輸入,並使程序爆炸。這曾經是網絡服務器中可遠程利用的安全漏洞的頭號原因。沒有大小修飾符

  1. 一些scanf格式字符串是一樣gets不安全,尤其是%s

    第二關,從來沒有使用任何的*scanf功能要麼,因爲。

  2. scanf中的數字溢出引發了未定義的行爲,這意味着程序可能會因爲某人鍵入的數字太大而崩潰。
  3. 使用scanf編寫穩健的輸入解析器非常困難,因爲如果失敗,它不會精確地告訴您問題字符在哪裏。

對於這樣一個簡單的任務,你應該使用fgets(或更好,getline如果有的話)的年齡轉換爲整數,strtoul。 (年齡不能爲負,所以你想要的簽名版本不要使用atoi和朋友 - 。就像*scanf,他們不給你關於無效輸入足夠的信息)

對於更復雜的任務,你應該達到爲lexyacc