2016-04-05 36 views
2

我正在處理一個文件處理項目,其中用戶將指定他想要輸入多少次,並且內容將以表格格式存儲在文件中。我的代碼是:找不到這個循環行爲

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    int n; 
    FILE *fptr; 
    fptr=fopen("input.txt", "w"); 

    if(fptr==NULL) 
     printf("The file could not be opened."); 

    printf("\nFile opened successfully."); 

    printf("\nHow many inputs do you want to make?"); 
    scanf("%d", &n); 

    printf("\nEnter contents: \n\n"); 

    char name[50]; 
    int age; 
    float salary; 
    int i; 

    for(i=1;i<=n;i++) 
    { 
     printf("\nName(Not more than 50 character): "); 
     gets(name); 

     if(name[strlen(name)-1]=='\n') 
      name[strlen(name)-1]='\0'; 

     printf("\nAge: "); 
     scanf("%d", &age); 

     printf("\nSalary: "); 
     scanf("%f", &salary); 

     fprintf(fptr, "%s\t\t%d\t$%.2f\n", name, age, salary); 
    } 
} 

我遇到的問題是循環無法正常執行。我無法輸入名稱。它跳過名稱,直接進行年齡輸入。我試圖與fgets()和scanf(「%[^ \ n]的S,名),沒有用。所以我希望我可以在這裏得到一些幫助。問候。

+0

啓用編譯器警告,也許。投票結束爲簡單的錯字。 – Lundin

+1

請注意,在C語言中沒有稱爲'gets'的函數,它在17年前已經過時並且在5年前被徹底刪除。你的學習來源C完全過時了。 – Lundin

+0

這是一個錯字。感謝您指出。不需要爲此命名。 – Masquerade007

回答

0

嘗試

scanf ("%s", &name); 

,對於工作我...如果沒有,張貼它給你,我會盡力幫助更多的輸出。

另外,絕對看WhozCraig的評論和修復這個bug了。

+0

scanf(「%s」,name)不允許存儲白色空間。我首先嚐試了這一點,它只存儲名稱的第一部分。那是當我省略循環時。 – Masquerade007

5

你做

循環之前
scanf("%d", &n); 

這會讀取數字,但不是您使用終止輸入的換行符,而是將新行保留在輸入緩衝區中。所以在循環中當你做

gets(name); 

它讀取換行爲一個空行。您需要跳過以前的scanf調用中的所有剩餘字符,包括換行符。例如,你可以有一個循環,一次只讀一個字符,直到你閱讀換行符。


作爲附註:不要使用gets。這是危險的,自C99標準以來已被棄用,並且在最新的C11標準中被完全刪除。建議的替代品是fgets

+0

是的,我通常不使用gets(),因爲它在我以前的項目上造成了很多麻煩。我從scanf(「%[^ \ n] s」,name)和fgets(name,sizeof(name),stdin)開始,但他們沒有工作,所以最終我嘗試了gets(),當我在這裏發佈問題它仍然在代碼中。 – Masquerade007