2012-11-21 53 views
25

我解析字符串(char*)和我使用sscanf從字符串的數字解析成雙打,就像這樣:獲取sscanf讀取的字符數?

// char* expression; 
double value = 0; 
sscanf(expression, "%lf", &value); 

這個偉大的工程,但後來我想繼續解析通過傳統方式串。我需要知道sscanf已解析了多少個字符,以便我可以從新的偏移量恢復手動解析。

顯然,最簡單的辦法就是以某種方式計算字符sscanf解析的數量,但如果沒有簡單的方法來做到這一點,我上午開放替代雙解析選項。但是,我目前使用sscanf,因爲它快速,簡單且可讀。無論哪種方式,我只需要一種方法來評估double,然後繼續解析。

回答

39

您可以使用格式說明%nsscanf()提供額外int *說法:

int pos; 
sscanf(expression, "%lf%n", &value, &pos); 

說明的格式說明n C99標準:

無輸入被消耗。 相應的參數應該是一個指向 的有符號整數,在這個整數中將寫入從函數到目前爲止從輸入流中讀取的字符數。執行%n指令不會增加fscanf函數執行完成時返回的賦值計數。沒有參數被轉換,但一個被消耗。如果轉換規範包含分配抑制字符或字段寬度,則行爲未定義。

經常檢查sscanf()的返回值,以確保任務進行了改造,並且隨後的代碼不誤過程變量,其值則維持不變:

/* Number of assignments made is returned, 
    which in this case must be 1. */ 
if (1 == sscanf(expression, "%lf%n", &value, &pos)) 
{ 
    /* Use 'value' and 'pos'. */ 
} 
+0

我似乎無法使其適用於[Microsoft實施](https://msdn.microsoft.com/en-us/library/t6z7bya3.aspx?f=255&MSPPError=-2147217396),因爲:' sscanf_s(p,「%s%d \ n%n」,toString,(int)_countof(toString),&itemCount,&pos);'pos'似乎根本沒有改變。 – c00000fd

2
int i, j, k; 
char s[20]; 

if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3) 
    ...something went wrong... 

變量k包含的字符數直到掃描存儲在j中的整數的結尾。請注意0​​不計入轉換成功。如果需要,您可以在格式字符串中多次使用%n

相關問題