我正在尝试在C中使用sscanf从字符串中获取一些值。但是,如果字符串的值多于我想要的值,我需要它来抛出错误。即。如果我想要一个整数,“2”应该没问题,但“2 5”应该崩溃。
现在在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') {
答案 0 :(得分: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
的测试)。
答案 1 :(得分:0)
一个更简单的测试,只使用 scanf
返回值而不是一个返回值和一个字符数的测试,可以使用:
if (1 == sscanf(mystring, "%d %c", &num, &(char){0}))
这是可行的,因为如果在尾随空格被消耗后有任何字符,则会执行第二次赋值,因此返回值是 2 而不是 1。
((char){0}
是一个复合字面量,它提供一个临时对象来保存分配的 char
,之后它被丢弃。)