2012-04-14 37 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