2015-06-22 27 views
1

我需要從一個單一行中獲取一個單獨的不同輸入。特別是我需要獲得一個單獨的char,然後根據剛剛讀取的值,它可以是一個字符串和一個int或一個字符串,一個int和另一個字符串等等。scanf一次獲得多個值

樣本輸入可能是:

c test 20 good 
d test 10 

這是我寫的:

char c, * alpha, * beta; 
int val; 
c = getchar(); 
printf("%c\n\n", c); 

switch (c){ 
    case 'd': scanf("%s %d", alpha, &val); printf ("%c %s %d", c, alpha, val); break; 
    case 'c': scanf("%s %d %s", alpha, &val, beta); printf ("%c %s %d %s", c, alpha, val, beta); break; 
    default: return 0; 
} 

而且它需要一個換行符(即我按回車鍵)來獲得的第一個字符,它工作正常對於d的情況,但在c的情況下進入段錯誤。我應該怎麼做?

+2

'alpha'和'beta'指向無處。你應該爲他們分配一些內存。 – mch

+1

「alpha」和「beta」或「malloc()」的'char'數組。 –

+1

爲避免必須輸入換行符,請讀取一個字符串,然後使用sscanf。你可以調用它來獲得第一個字符,然後第二次基於char值 – samgak

回答

3

我並不是說它不能使用scanf()來完成,但恕我直言,這不是最好的方式來做到這一點。相反,使用fgets()來讀取整個樣本,使用strtok()標記輸入,然後根據第一個標記值根據需要迭代輸入字符串。

的通用算法看起來像

  1. 閱讀使用strtok()使用空間()作爲分隔符使用fgets()
  2. 記號化一整行。
  3. 取第一個標記,將其與所需的輸入選項cd進行比較。

    注:不要混淆基於令牌值的字符'c''d'"c""d"

  4. ,可以更呼籲strtok()在同一個字符串添加到得到的值在輸入剩餘的數據後,可以利用現有的switch-case的方法。一般而言,直到strtok()返回NULL。

這就是說,要回答你的問題,

它工作正常的情況下d但進去段錯誤的c情況。

的原因是,在目前的程序,你的代碼調用undefined behaviour,因爲你正在使用未初始化的指針alphabeta。你需要在使用前爲他們分配內存,也許通過malloc()和家人。

0

您可以使用單個scanf來完成此操作,但是您需要根據第一個字符進行讀取後解析輸入。

char c, alpha[20], tmp[20]; 
scanf("%c %s %[^\n]\n", &c, alpha, tmp); 

//Here 20 is taken for example, size can be anything 

然後你可以檢查c它的價值。如果c=='c'那麼,您需要將tmp分爲兩部分,其中第一個是整數,您可以使用atoi()函數將其存儲在val中,另一部分是字符串。

如果c=='d'那麼,你只需要複製tmpbeta,你就完成了。

+2

這會調用未定義的行爲。 'alpha'和'tmp'指向無處。 – mch

+0

爲什麼'''%[^ \ n] s「'? – chux

+0

@mch如果你爲它分配內存,或者只是創建一個字符數組,它不會給出未定義的行爲。這裏是示例鏈接:http://ideone.com/HQoiaN – shreyans800755

1
char c, alpha[8], beta[8]; 
int val; 
char line[32]; 
int state; 

fgets(line, sizeof line, stdin);//input by one line 
state = sscanf(line, " %c %7s %d %7s", &c, alpha, &val, beta); 
if(c == 'd' && state == 3) 
    printf ("%c %s %d", c, alpha, val); 
else if(c == 'c' && state == 4) 
    printf ("%c %s %d %s", c, alpha, val, beta);