2012-04-14 47 views
2

我想在C中使用sscanf從字符串中獲取一些值。但是,如果字符串的值比我想要的更多,我需要它來引發錯誤。即。如果我想要一個整數,「2」應該可以,但「2 5」應該會崩潰。C:sscanf分配抑制和返回值

現在使用上sscanf的返回值,像這樣:

if (sscanf(mystring, "%d %*s", &num) == 1) 

不起作用,因爲它會返回1,即使字符串是更長的時間。我可以這樣做:

char tmpString [100]; 
if (sscanf(mystring, "%d %s", &num, tmpString) == 1) 

它工作正常,但它不是特別好。有另一種方法嗎?我可以使用分配抑制並仍然獲得我想要的返回值嗎?

編輯 這是我所使用的代碼:

char c; // This is a global variable, just gets used over and over. 
sscanf(mystring, "%d%c", &num, &c); 
    if (c == '\n') { 
+1

我通常這樣做:'char c; if(sscanf(mystring,「%d%c」,#num,&char)== 1)' – 2012-04-14 04:26:42

+0

如果你只是想讓它崩潰,你可以使用: 'sscanf(mystring,「%d%d」,&num1 ,&num2);'(= – dcow 2012-04-14 04:26:45

+0

)感謝Jared。我的猜測與我的代碼相同,但只使用了一個字符更有效。 – morgoe 2012-04-14 04:35:57

回答

1

一種可能性是:

int pos; 
if (sscanf(mystring, "%d %n", &num, &pos) == 1) 
{ 
    if (mystring[pos] != '\0') 
     ...oops...extra data... 
    else 
     ...only number... 
} 
else 
    ...not even one number... 

%n是C89的一部分。它不是一個特別常用(或廣爲人知)的轉換規範。它不會被算作轉換(因此測試1)。

+0

謝謝,這似乎比上面的Jared的代碼複雜得多:'char c; if(sscanf(mystring,「%d%c」,#num,&char)== 1)'。是否有任何好處? – morgoe 2012-04-14 04:35:06

+0

你的選擇;它不是那麼複雜,並且當數字後面只有空白(空格)時不會抱怨,而如果Jared的代碼在數字後面有空格或換行符,則會給你一個錯誤。當然,這取決於你想要什麼。'%n'也可以讓你啓動sc如果這是你想要的(可能不是在這種情況下)數字結束後的結尾。 – 2012-04-14 04:37:26

+0

好的謝謝。我使用了你的代碼和Jared的混合,因爲如果數字後面有空格,我需要它會拋出一個錯誤,但如果有新行,則不會。我把代碼放在OP的末尾。 – morgoe 2012-04-14 04:43:06