2016-03-11 31 views
-5

我想在輸入來自用戶,因此用戶會這樣說 名年齡Age_of_brother Age_of_sister 這樣我就可以得到一個輸入像 「約翰·18」 或「約翰福音18 20」或 「約翰19 20 121」 任何類型的東西。 所以我知道我能做到 假設「命令[80]」有我的字符串sscanf的初學者使用C

sscanf(command, "%s%d%d%d", string, &int1, &int2, &int3); 

,但我已經試過了,當我比較INT2或INT3爲NULL,它總是最終打印出一個隨機整數對於int2或int3,即使它被解除引用。那麼我該如何解決這個問題?

+0

請發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。我懷疑你通過將指向指向具有錯誤類型的對象的指針傳遞給'sscanf()':'%d'期望'int *'而導致* undefined behavior *,但是您可能正在傳遞'int **',因爲你寫了「即使它被解除引用「。請注意,'int3'不會受到影響,因爲沒有用於修改它的格式說明符。 – MikeCAT

+2

檢查「int2或int3爲NULL」不是正確的做法。首先,因爲那些(可能)是int類型而不是指針。其次,如果沒有匹配,'sscanf'不會寫入它們。相反,您應該閱讀[sscanf手冊頁](http://linux.die.net/man/3/sscanf)以瞭解其運作方式。特別是關於返回值的部分:「這些函數返回成功匹配和分配的輸入項的數量,這可能少於規定的數量,甚至在發生早期匹配失敗的情況下甚至爲零。」 – kaylum

+0

您的格式指定1個字符串和2個整數。您的參數列表似乎是傳遞1個字符串(char)指針和3個整數指針。它是什麼,你的格式表示2個整數,或者你的參數列表指示3個整數?就目前而言,'int3'不會受到'scanf'調用的影響。 –

回答

0

@ n.Doe,

什麼,你可能會遇到的是,變量沒有被初始化,所以看到一些隨機值當的sscanf()沒有去尋找那些失蹤者的內容。嘗試初始化它們如下。

int int1 = 0, int2 = 0, int3 = 0; 

此外,sscanf的()需要在順序變量地址(因此你使用& VAR)能夠以更新他們在內存提及的內容。因此,在打印由它們保持的值或將它們與零比較時(不是NULL,這意味着與指針進行比較),請不要反引用它們。由於變量int1-3已初始化,因此當sscan()無法讀入它們時,您將看到0被打印出來。