4

我正在尝试在 C 中使用 sscanf 从字符串中获取一些值。但是,如果字符串的值比我想要的多,我需要它来引发错误。IE。如果我想要一个整数,“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') {
4

2 回答 2

3

一种可能性是:

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)。

于 2012-04-14T04:33:12.860 回答
0

一个更简单的测试,只使用scanf返回值而不是返回值的一个测试和一个字符计数,可以通过以下方式实现:

if (1 == sscanf(mystring, "%d %c", &num, &(char){0}))

这是有效的,因为如果在尾随空格被消耗后有任何字符,则会执行第二次赋值,因此返回值是 2 而不是 1。

(这(char){0}是一个复合文字,它提供了一个临时对象来保存分配的char,之后它被丢弃。)

于 2021-01-14T12:08:45.277 回答