2013-07-06 50 views
-3

我正在寫一個C程序,該程序的目標是我只想輸入4個學生的結構細節。但是我的程序錯過了一些東西,所以我的程序在輸入第一個學生詳細信息後退出看看這裏請進入連我都選擇的學生人數爲4一個學生的詳細信息後C scanf()不解析我的輸入

# include <stdio.h> 

struct student 
{ 
int no; 
char name[20]; 
float marks; 
}s[10]; 

int main() 
{ 
int i,n; 


printf(" enter number of students "); 
scanf("%d",&n); 

printf(" enter student Number Name marks "); 
for(i=0;i<n;i++) 
{ 
scanf("%d%c%f",&s[i].no,&s[i].name,&s[i].marks); 
} 
return 0; 
} 

程序退出。

我甚至只輸入第一個學生的資料後,給這裏

[[email protected] raja]# gcc -o s s.c 
[[email protected] raja]# ./s 
enter number of students 4 
enter student Number Name marks 1 as 12.03 
[[email protected] raja]# 

其退出程序的輸入。 幫助我。

+1

輸入什麼你給它?你的輸入閱讀方案相當脆弱。 – Gian

+0

@Gian我編輯了我的答案,請查看它。謝謝。 –

+1

請不要使用「使用scanf」來讀取字符串,而是使用fgets(data,sizeof data,stdin) – FacundoGFlores

回答

3

這是正確的代碼

# include <stdio.h> 

struct student 
{ 
    int no; 
    char name[20]; 
    float marks; 
}s[10]; 

int main() 
{ 
    int i,n; 


    printf(" enter number of students "); 
    scanf("%d",&n); 

    printf(" enter student Number Name marks "); 
    for(i=0;i<n;i++) 
    { 
    scanf("%d%20s%f",&s[i].no,s[i].name,&s[i].marks); 
    } 
    return 0; 
} 

第一個錯誤是%C應該是%S,因爲你期待一個字符串而不是一個字符。 第二個是當你期望%s時,你只需要傳入變量名稱,因爲它是一個數組,因此是一個指針。 20在s指定name變量的字符串允許的寬度之前。如果名稱輸入字符串的長度超過20,則會混淆其他變量的輸入,程序將終止或發生意外行爲。

+0

非常感謝你,它的幫助。 –

+2

嗯......這比較好,但是假設學生名稱不包含空格,並且不檢查scanf()是否成功。如果用戶輸入99作爲學生人數,整個程序工作得並不好,但是程序的設計應該讓計算機進行計數,而不是讓用戶在前面進行計算(計算機擅長於數數!)。如果程序也提示每個條目可能會更好。當然,這些都是原始設計中的問題。使用'%s'而不是'%c'確實是解決方案的關鍵部分。 –

+0

@Jonathan同意。我正在尋找最簡單的解決方案來解決所提出的問題。 – 2013-07-06 04:02:57

0

此:

scanf("%d%c%f" 

應該更像這樣:

scanf("%d %s %f" 
+0

好吧我已經嘗試了您的建議,沒有運氣。感謝你的回答。你的建議幫助我清晰地看。 –

+0

現在不要放棄 - 試試打印scanf的返回值。你總是需要檢查你的返回值。可能第一個由於某種原因失敗 - 你還沒有告訴我們你的輸入是什麼樣子。 –

0

這裏的錯誤:

scanf("%d%c%f",&s[i].no,&s[i].name,&s[i].marks); 

正確的答案是:

scanf("%d%s%f",&s[i].no,&s[i].name,&s[i].marks); 
+0

非常感謝您的回答但是我已經用第一個答案解決了我的問題,並且您的答案中還有一個更正,它的名稱是s [i] .name not&s [i] .name –

+0

tow是相同的: - ) –