使用sscanf读取可选数字

时间:2016-02-07 04:27:47

标签: c

我知道C中的sscanf()不支持正则表达式。但是,我想知道是否有办法阅读int可选,如下所示:

例如:

cost apple
cost apple, 3  // comma, and 3 are optional

如果我使用

sscanf("cost %s \, %d" , &product , &value);

它会失败,因为',3'可能不会出现在字符串上。

是否可以通过sscanf()一次拍摄来解决问题?

3 个答案:

答案 0 :(得分:4)

由于其他原因,sscanf会失败,一旦修复,它就不会失败,因为'3'没有出现在字符串上。

我建议您从sscanf获取返回值,然后使用它来确定读取的数据量。

#include <stdio.h>

void test(const char *data) {
    char product[100];
    int value;
    int ssret;

    ssret = sscanf(data, "cost %99[^,], %d", product, &value);
    switch(ssret) {
        case 1:
            printf("product = %s\n", product);
            break;
        case 2:
            printf("product = %s, value = %d\n", product, value);
            break;
        default:
            puts("sscanf() failed to read");
            break;
    }
}

int main(void) {
    test("cost apple");
    test("cost apple, 3");
    return 0;
}

答案 1 :(得分:2)

您可以使用完整版(&#34;%s%d&#34;)。 sscanf将返回分配的变量数。来自http://www.cplusplus.com/reference/cstdio/sscanf/

  

成功时,该函数返回成功填充的参数列表中的项目数。此计数可以匹配预期的项目数,或者在匹配失败的情况下更少(甚至为零)。

所以如果你只有&#34;花费苹果&#34;作为输入,sscanf将返回1并填充product。鉴于&#34;成本苹果,3&#34;它将返回2并填充productvalue

您的代码也存在一些问题。首先,sscanf的第一个参数应该是要读取的字符串。不是格式字符串。其次,格式字符串需要是一个字符串,使用双引号(&#34;)。第三,不要逃避逗号,这不是一个有效的转义序列。

无论如何,您无法在格式字符串中使用该逗号。 %s说明符读取字符,直到它看到的第一个空白字符。因此,"cost apple, 3"的输入字符串需要格式说明符"cost %s %d"。然后,您必须获取不带逗号的子字符串才能获得实际的产品名称。

答案 2 :(得分:1)

首先,sscanf()的原型是int sscanf ( const char * s, const char * format, ...);

所以试试这个:

#include <stdio.h>

int main()
{
        char product[100] = {0};
        int value = 0;

        sscanf("cost apple", "cost %[^,\n], %d", product, &value);
        printf("cost %s, %d\n", product, value);

        sscanf("cost apple, 3", "cost %[^,\n], %d", product, &value);
        printf("cost %s, %d\n", product, value);

        return 0;
}

%[^,\n]中的sscanf()char,之外的\n匹配。 之前的%d用于丢弃所有空格字符。

此外,使用&product会导致未定义的行为,因此请改为编写product

修改

检查sscanf()的返回值始终是一个好习惯。虽然您将在不执行此操作的情况下成功编译并运行代码,但它会告诉您哪些信息有用,哪些信息无效。