我知道C中的sscanf()
不支持正则表达式。但是,我想知道是否有办法阅读int
可选,如下所示:
例如:
cost apple
cost apple, 3 // comma, and 3 are optional
如果我使用
sscanf("cost %s \, %d" , &product , &value);
它会失败,因为',3'可能不会出现在字符串上。
是否可以通过sscanf()
一次拍摄来解决问题?
答案 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并填充product
和value
。
您的代码也存在一些问题。首先,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()
的返回值始终是一个好习惯。虽然您将在不执行此操作的情况下成功编译并运行代码,但它会告诉您哪些信息有用,哪些信息无效。