2012-06-13 187 views
0

我想知道爲什麼i的值爲0之前已經調用了sscanf。我期待修改i的價值。爲什麼sscanf不填充變量?

我使用在窗口7 cygwin的GCC,版本3.4.4

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    unsigned char a[] = {1, 2, 3, 4, 5}; 
    int i = 0; 

    printf("\nread value %d\n", sscanf(&a, "%d", &i)); 
    printf("\nvalue is %d\n", i); 
    printf("\nbuffer is %s\n", a); 
} 

輸出

讀取值0

值爲0

緩衝器是一些特殊字符

回答

2

首先sscanf的第一個參數應該是一個指向char的指針,但是你傳入一個指向char數組的指針,這是一個錯誤的類型。儘管如此,這只是切題。

要回答你的問題:如果該值的格式說明符在字符串中匹配,sscanf(與其他* scanf函數一樣)只寫入一個值。因此,如果您有格式說明符「%d」,則只有字符串以數字開頭時,纔會將int寫入給定的int指針。正如你自己所說的,你的字符串只包含垃圾:值爲1到5的(不可打印的)字符,後面是a之後的任何內存。所以它不以數字開始,因此不會寫入數字。

+0

亞我明白了。我認爲像'sscanf'會先讀取4個字節(1,2,3,4),它會嘗試用4個字節值的組合來打印某個大數字。實際上,只有當'a'的每個字節包含48到57(0到9)的值時,它纔會被讀取。感謝你的解釋。 – rashok

+0

我對sscanf有另一個疑問。 – rashok

+0

我對sscanf有另一個疑問。考慮'unsigned char a [3] = 0;'buffer。並考慮我在第一個2字節stroing一些有效的數字。因此'printf(「%s」,a)'正在打印某個值('75')。在這種情況下,如果我做'sscanf(&a,「%d」,&i)'這個語句是否會嘗試讀取第四個字節,否則一旦滿足'\ 0',它將簡單地退出3字節本身。 – rashok

1

sscanf用於STRINGS,而不是不包含字符終止符\ 0的字符數組。從串

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

讀取格式化數據根據參數格式轉換成由 附加參數給定的位置,從STR並存儲它們 讀取數據。每個附加參數 指向的位置都填充了其在 格式字符串中指定的相應類型的值。

0

這會給你你所期望的。

a已經是指針,所以簡單地a足以作爲用於sscanf第一個參數。將0(即\0)作爲a中的最後一個條目可能是個好主意,因爲您將它傳遞給sscanfprintf,因爲這些文件預計會打印一個null終止的字符串。

我還將i的類型更改爲unsigned char以匹配您正在閱讀的數據。

int main() 
{ 
    unsigned char a[] = {1, 2, 3, 4, 5, 0}; 
    unsigned char i = 0; 

    printf("\nread value %d\n", sscanf(a, "%c", &i)); 
    printf("\nvalue of i is %d\n", i); 
    printf("\nbuffer is %s\n", a); 
    return 0; 
} 

注意:您在前面已經得到0,因爲sscanf未能從a爲你「讀」的任何數據。

1

您的代碼中沒有意外的行爲。請注意,函數sscanf從給定字符串讀取數據,並且「」返回填充的變量數「。您正在傳遞一個char數組a作爲從中檢索數據的來源,而不僅僅是它不包含任何數字(1'1'不相同),它也不是以null結尾(缺少)。

通過"%d"您指定十進制整數應讀,但沒有十進制整數給定數組中這樣sscanf不讀任何數字和i停留不變。函數返回0,表示沒有填充變量。

將您傳遞給sscanf的數組聲明更改爲有效的字符串,並且它會產生所需的行爲。嘗試char a[] = "1 2 3"