2015-05-22 73 views
0

中的掃描集的意外輸出。應該接受一個數字,直到它遇到一個4,但它會給一些垃圾值。爲什麼?正如預期的那樣,C

int main(void) 
{ 

    int a; 
    printf("Enter a number: "); 
    scanf("%[^4]d", &a); 

    printf("You entered: %d\n", a); 

    return 0; 

} 
+2

請注意,格式將永遠不會讀取所請求的'd',因爲如果數據中有'd',它將作爲與掃描集匹配的字符串的一部分被讀取(因爲'd'是不是數字'4')。您還需要認識到掃描集適用於字符串,而不適用於整數 - 這就是爲什麼'd'只是格式字符串中的文字字符,而不是轉換規範的一部分。 –

回答

2

據我知道scansets意指與串被使用(這使得d不充當佔位符整數規範)。把它寫的一個方法是閱讀輸入一個字符串,然後解析它:

int main(void) 
{ 
    int a; 
    char b[255]; 
    printf("Enter a number: "); 
    scanf("%254[^4]", &b); 

    a = atoi(b); 
    printf("You entered: %d\n", a); 

    return 0; 
} 

我讓修改後的代碼到最低限度,你肯定會需要輸入理智一些額外的檢查。

澄清:254前綴限制了要捕獲的數據量,以便不超過緩衝區的大小(字符串以一個額外的空字符終止,因此讀取長度必須小於實際值大小)1

1

scanset只能使用字符。

這是我的示例代碼。 (但是,我不知道你真正想要的東西。)

#include <stdio.h> 
int main(void) { 
    char buffer[128]; 
    printf("Enter a number: "); 
    scanf("%[^4]s", buffer); 

    printf("You entered: %s\n", buffer); 

    return 0; 
} 

結果是,

Enter a number: 12345678 
You entered: 123 

此外,如果你想整數值,使用atoi()

+0

請注意,'s'是文字's',不屬於掃描集轉換規範的一部分。請參閱我對問題的評論,指的是問題中的「d」。但你說得對,掃描集是用於字符串,而不是整數,但掃描集不包含's'。 –