2012-02-18 97 views
3

我有C代碼做一些計算(我認爲與我的問題無關)。該程序將要求一些參數進行計算。問題是當我運行代碼時,scanf(「%c」,& ch)工作不正常。scanf()不帶任何輸入

我對是否可以重現此問題感興趣,因爲它似乎沒有出現任何問題,是嗎?

我發佈了一個可編輯和縮短版本的程序。

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
int main(void) 
{ 
     float Dia_MM, Dia_I, Se1, Se, Sut = 75.00; 
     float Ka, Kb, Kc, Kd, Ke, Kf; 
     char Ch; 
     char Bt; 
     float Reli; 
     printf("Please input the surface condition of the shaft: G, M, H or A\n"); 
     scanf("%c", &Ch); 
//  getchar(); 
     printf("Please input the diameter of the shaft in inch\n"); 
     scanf("%f", &Dia_I); 
     printf("Please specify whether your shaft is in bending (B) or torsion (T)"); 
     scanf("%c", &Bt);// THIS LINE IS JUST SKIPPED 
     exit(0); 
} 

的GDB日誌中列出:

Breakpoint 1, main() at main.c:25 
    25  float Dia_MM, Dia_I, Se1, Se, Sut = 75.00; 
    (gdb) n 
    30  printf("Please input the surface condition of the shaft: G, M, H or A\n"); 
    (gdb) n 
    Please input the surface condition of the shaft: G, M, H or A 
    31  scanf("%c", &Ch); 
    (gdb) G 
    Undefined command: "G". Try "help". 
    (gdb) n 
    G 
    33  printf("Please input the diameter of the shaft in inch\n"); 
    (gdb) n 
    Please  input the diameter of the shaft in inch 
    34  scanf("%f", &Dia_I); 
    (gdb) n 
    4.5 
    35  printf("Please specify whether your shaft is in bending (B) or torsion (T)"); 
    (gdb) n 
    36   scanf("%c", &Bt); 
    (gdb) n       //PROBLEM HERE. SCANF() GOES BEFORE TAKE ANY INPUT. 
    37  exit(0); 
+2

「請指定軸是否彎曲或扭轉。」 * chortle * – x0n 2012-02-18 23:06:44

+0

@ x0n:我會更加擔心振動:-) – thkala 2012-02-18 23:08:44

回答

4

scanf()不消耗後換行。跳過的scanf()接收用戶輸入的以前線換行和終止沒有收到你所期望的更多的輸入...

scanf()是用換行有點麻煩。一個可能的解決方案是使用fgets()從控制檯獲取一行,然後使用sscanf()來解析接收到的字符串。

另一個更有針對性的解決方案是在最後一次scanf()調用的格式字符串中使用" %c"%c格式說明符本身並不消耗前導空白,這就是爲什麼它會得到剩餘的換行符,而不是由用戶鍵入的字符。

+0

所以你的意思是把它改爲printf(「請指定你的軸是彎曲(B)還是扭轉(T)\ n」);?我試過,但仍然是同樣的問題 – YankeeWhiskey 2012-02-18 23:07:19

+0

@YankeeWhiskey:如果你錯過了,我已經編輯了幾個可能的解決方案我的答案... – thkala 2012-02-18 23:36:53

+0

謝謝。我看到了。 – YankeeWhiskey 2012-02-18 23:59:07

4

由於thkala告訴上面scanf()不消耗尾隨newlines.But有從使用\nscanf("%c\n",...)前一行吸收新行的另一種方式。

+0

使用'%* c'來讀取一個字符而不分配任何結果。 – 2014-11-22 09:02:36