2017-06-11 35 views
3

所以我寫了這個代碼(忽略緩衝區溢出問題,因爲這只是一個簡單的例子)後,所儲存的字符串:的scanf(「%S」),甚至用它的scanf後(「%d」)

#include<stdio.h> 
int main(void){ 
    int n; 
    char s[10]; 
    printf("Enter a number: "); 
    scanf("%d",&n); 
    scanf("%s",s); 
    printf("%s",s); 
    return 0; 
} 

字符串不應該存儲在數組中,因爲輸入緩衝區中應該有一個「\ n」,因此應該終止scanf(「%s」,s),但事實並非如此。輸出打印字符串。

+0

@xing非常感謝你。我不知道。 –

+0

通常,它只會導致後續的「%c」格式說明符出現問題,除非特別指示爲使用'「%c」',否則不會自動跳過前導空格。 –

+0

「...因爲在輸入緩衝區中應該有一個」\ n「...」 - 你從哪裏得到這個想法? 'scanf'完全不關心'\ n'。對於'scanf','\ n'只是另一個空格字符。 – AnT

回答

3

格式說明%s跳過空格領先,即任何'\n'' ''\t',...將被忽略,s[0]將包含輸入的第一個非空格。

爲了證明什麼在scanf回事一點點,請看下面的例子,它利用了"%n" -feature的scanf,這還給該迄今已處理的字符數;我用sscanf這樣的結果不依賴於用戶輸入。請注意,字符串在閱讀的時候,scanf處理比存儲在結果更多的字符:

#include<stdio.h> 
int main(void){ 
    int n; 
    int pos; 
    char s[10]; 
    const char* simulatedInput = "123\n  abcde"; 
    const char* inputPtr = simulatedInput; 

    sscanf(inputPtr,"%d%n",&n,&pos); 
    printf("sscanf on %s processed %d charaters; result n: %d\n", inputPtr, pos, n); 

    inputPtr += pos; // inputPtr will point at the position of '\n' 
    sscanf(inputPtr,"%s%n",s,&pos); 
    printf("sscanf on %s processed %d charaters; yet s as '%s' contains only %lu characters\n", inputPtr, pos, s, strlen(s)); 

    return 0; 
} 

輸出:

sscanf on 123 
    abcde processed 3 charaters; result n: 123 
sscanf on 
    abcde processed 11 charaters; yet s as 'abcde' contains only 5 characters 
+2

只是一個nit-pick:['scanf()']的POSIX規範(http://pubs.opengroup.org/onlinepubs/9699919799/功能/ scanf.html),在一個沒有標記爲POSIX擴展的部分中說,'空白'包括換行符''\ f''和垂直標籤''\ v''以及空白,製表符和換行符。這不是一個主要問題;你很少遇到。 ('Tis好奇的是,C標準在缺省(C)語言環境中將'回車符\'添加到由'isspace()'識別的字符列表中.C標準說'空白'沒有列出字符。這意味着「什麼'isspace()'說的是空白空間」)。 –

相關問題