2012-10-20 46 views
1
void main(){ 
    char tech[30][30],fname[50]; 
    int tn,i=0; 
    FILE *fp; 

    printf("File name\n"); 
    gets(fname); 

    printf("No of lines\n"); 
    scanf("%d",&tn); 

    for(i=0;i<tn;i++){ //gets here will not take anything for the first line 
     printf("%d",i+1); 
     gets(tech[i]); 
    } 

    fp=fopen(strcat(fname,".txt"),"w"); 

    for(i=0;i<tn;i++) 
     fprintf(fp,"%s\n",tech[i]); 
    fclose(fp); 
} 

工作在for環路(在程序中提到的)gets()不接受針對第一行的任何字符,它直接請求第二行輸入。爲什麼?得到未環

+4

請避免'gets' ... – md5

+1

因爲上面的'scanf'沒有消耗掉新的行字符 - 所以'gets'只會吃掉新行字符而不是下一行。 – nhahtdh

回答

2

因爲scanf沒有消耗換行符,所以您必須在scanf之後清潔stdin

#include <stdio.h> 

/* Consume characters remaining in the input stream. */ 
void clean_stdin(void) 
{ 
    int c; 
    while ((c = getchar()) != '\n' && c != EOF) 
     ; 
} 


int main(void) 
{ 
    int tn; 

    /* ... */ 

    scanf("%d", &tn); 
    clean_stdin(); 

    /* ... */ 

    return 0; 
} 

您還應該避免gets,這是折舊。

+0

「折舊」意味着價值下降... ITYM「已棄用」,但它不是這樣 - 它現在已從C完全移除 –