2012-10-11 128 views
9

考慮下面的代碼:空白格式字符串(scanf函數)

#include<stdio.h> 
int main() { 
    int i=3, j=4; 
    scanf("%d c %d",&i,&j); 
    printf("%d %d",i,j); 
    return 0; 
} 

它的工作原理,如果我給2c32 c 32c 3作爲輸入,如果我必須要改變的變量的值。如果我想要用戶輸入相同的模式,我想要的意思是%dc%d,那麼只有2c3可以接受,而不是2 c 3,如果是%d c %d,反之亦然?

回答

10

空格格式字符串匹配輸入中的0個或多個空格字符。

因此"%d c %d"需要編號,然後是任何數量的空白字符,然後字符c,然後任何數量的空白字符和另一個數字在末尾。

"%dc%d"預計編號,c,編號。


還要注意,如果在格式字符串中使用*,它抑制了分配:
%*c =讀1個字符,但不要把它分配給任何變量

所以,你可以使用"%d%*c c%*c %d"如果你想要強制用戶輸入:號碼,至少1個字符後跟任何數量的空白字符,c,至少1個字符,再加上任何數量的空白字符和數字。

+2

雖然是正確的,這實際上並沒有回答關於如何進行,如果這個問題你想堅持空白或不空白。 – Vicky

+1

此答案錯誤地表明在整數之前不允許使用空格。 ''%dc%d「'期望任何數量的空白字符,數字,''c'',任何數量的空白字符,數字.'。 – chux

0

我想我會讀取scanf結果爲不同的變量(即不重用ij)作爲"%d%s%d"。然後檢查從%s得到的字符串,如果它符合您的要求,請使用其他變量來覆蓋i和j。

0

力的字符串解析第一:

char a[100], b[100]; 
scanf("%99s c %99s", a, b); 

然後使用的sscanf()將字符串轉換爲int。

4

如果你想接受1c2但不1 c 2,使用模式,而沒有空間:

scanf("%dc%d", &x, &y); 

如果你想接受1c21 c 2(也1 \t \t c \t 2等),使用與空間格局:

scanf("%d c %d", &x, &y); 

如果你想接受1 c 2但不1c2,添加一個字符串假含有空格:

scanf("%d%*[ \t]c%*[ \t]%d", &x, &y); 

這裏串%[ \t]將意味着「讀取包含任何數量的空格和製表字符的字符串」的格式;但使用額外*,就變成了「預計包含任何數量的空格和製表字符的字符串,然後丟棄

+0

「%d c%d」中'「%d」'之前的空格是不相關的 - 與''「%d c%d」''同樣的結果。即使沒有這個領先空間,空白也是可以接受的。 – chux