2010-09-25 61 views
0

我正在嘗試使用5個字符和5個浮點數輸入。同時掃描字符和浮點數時出現問題

main() 
{  
char c[5];  
float q[5];  
int i; 

for(i=0;i<5;i++) 
{ 
     printf("\n%d ",i); 
    scanf("%c",c+i); 
    scanf("%f",q+i); 
    } 
} 

但是輸出是荒謬的。兩次連續掃描後,它跳過第三次掃描,然後再次跳過第五次掃描。 我不明白爲什麼會顯示這樣的行爲。 我正在使用gcc編譯器。

回答

0

fflush()未在輸入流上定義,如stdin。不要這樣做。

如果你想「讀和丟棄,直到換行」,然後執行:

int ch; 
do { 
    ch = getchar(); 
} while (ch != EOF && ch != '\n'); 

注意%c意味着「讀取輸入流中的下一個字符,即使它是空白,然後停止」。 %f表示「讀取並放棄空格,然後嘗試從輸入流中讀取一個浮點數,然後停止。」

+0

它仍然沒有工作。 – Mohit 2010-09-25 06:47:02

2

Use of scanf is not recommended因爲這樣的問題。

而是使用fgets讀取整個行,然後用sscanf提取你想要什麼(一charfloat)從線剛讀:

char line[MAX]; 
    for(i=0;i<5;i++) 
    { 
      if(fgets(line,MAX,stdin) && sscanf(line,"%c", c+i)!=1) 
        *(c+i) = 0; 
      if(fgets(line,MAX,stdin) && sscanf(line,"%f", q+i)!=1) 
        *(q+i) = 0.0; 
      printf("%c %f\n",*(c+i),*(q+i)); 

    } 
+0

我無法找到我的代碼的這種行爲的原因。你能向我解釋一下嗎? – Mohit 2010-09-25 07:03:12

1

要直接回答爲什麼第三和所有其他掃描「跳過」,這是scanf()%c格式的工作方式。當撥打電話scanf()時,您通常必須按Enter才能「提交」輸入。因此,將一個換行符插入到stdin流中。

當前一次浮動掃描得到輸入時,換行符仍保留在流中。當字符掃描到達時,剩餘的換行符會被讀入,因爲它可以有效地「跳過」呼叫。

使用fgets()sscanf() codaddict建議。

但是作爲一個快速修復,您可以嘗試在浮動掃描之後添加對getchar()的調用,以消耗流中的換行符。

編輯:
您是說這不起作用? (假設你輸入了正確類型的值,每scanf函數調用之一)

main() 
{ 
    char c[5]; 
    float q[5]; 
    int i; 

    for(i=0;i<5;i++) 
    { 
     printf("\n%d ",i); 
     scanf("%c",c+i); 
     scanf("%f",q+i); 
     getchar(); 
    } 
} 
+0

甚至連getchar()都不起作用。我甚至使用過fflush(stdin),但結果仍然是一樣的。 – Mohit 2010-09-25 07:06:37

+0

它仍然無法正常工作。 – Mohit 2010-09-25 07:18:20

+0

謝謝,這是行得通的。我第一次弄錯了。 – Mohit 2010-09-25 16:49:52

0

您的代碼應該是這樣的:

main() 
{  
char c[5];  
float q[5];  
int i; 

for(i=0;i<5;i++) 
{ 
     printf("\n%d ",i); 
    scanf("%c",c+i); 
    while (getchar()!='\n'); 
    scanf("%f",q+i); 
    while (getchar()!='\n'); 
    } 
} 

句子while (getchar()!='\n');搜索,直到輸入的結束,所以它不會將'\ n'作爲q + i的輸入值。在scanf q + i之後還有另一個while (getchar()!='\n');,因爲您使用循環。

0

問題在float值後掃描char值。

解決方法非常簡單!

,而不是書面方式你像這樣的代碼

scanf("%c",&...) 

試試這個,

scanf(" %c",&...) 

太空前的「%C」將解決被忽視的價值迴歸問題(輸入)鍵,然後將浮點值輸入爲輸入。

當在字符值之前掃描浮點值時。 按下Return(Enter)鍵獲得的值將收集在以下char變量中。使用之前的空格(「%c」,& ...)會丟棄返回(回車)鍵所收集的值,導致Char值在下一行中被掃描。因此解決了Scanning Float-Char問題。

1

你應該試試這個:

int main(){ 
    char c[6];//char array size must be 6 to store five charecter 
       //as null-terminator('\0')will use the last one 
    float q[5]; 
    int i; 
    for(i=0;i<5;i++){ 
      printf("\n%d\n",i);fflush(stdout); 
      scanf("%c",&c[i]);fflush(stdin);//fflush(stdin) to clear input stream that 
              //next scanf() won't skip 
      scanf("%f",&q[i]);fflush(stdin);//fflush(stdin) to clear input stream that 
              //scanf() won't skip at new loop 
    } 
    return 0; 
    }