我是C语言的新手,在C语言中使用sscanf()时遇到了问题。
我的代码提示用户输入多行数据。单个数据就像Python元组(1、3)或(-3、2),并且每行可能包含几个由零个或多个空格分隔的“元组”,我的代码在下面,
char buffer[100];
while(fgets(buffer, sizeof buffer, stdin) != NULL) {
while(sscanf(&buffer, "%*[^0-9|-]%i%*[^0-9|-]%i", &key, &value) != 1) {
break;
}
printf("key==%d, value==%d\n", key, value);
}
我使用fgets读取用户输入的每一行,并使用sscanf来获取一个元组,但是sscanf似乎无法与一行中的第二个元组匹配(或如何匹配)。为什么?还是对我的问题有一些更明智的解决方案?
答案 0 :(得分:3)
InvalidArgumentException
说明符将给出扫描处理的字符数并将其存储在int中。
累积偏移量以迭代该行。
%n
可能返回EOF,0、1或2。请考虑使用sscanf
,因为您要扫描两个整数。
== 2
在事件char buffer[100];
int offset = 0;
int scanned = 0;
while ( fgets ( buffer, sizeof buffer, stdin) != NULL) {
offset = 0;
scanned = 0;
while ( sscanf ( buffer + offset, "%*[^0-9|-]%i%*[^0-9|-]%i%n", &key, &value, &scanned) == 2) {
offset += scanned;
printf("key==%d,value==%d\n",key,value);
}
}
不起作用的情况下,可以使用%n
查找一个strchr
,对(和两个整数进行扫描,然后找到结束的(
。重复。
这使用@WeatherVane建议的更简单的格式字符串。
)
另一种策略可以使用char buffer[100];
char *begin = NULL;
char *end = NULL;
while ( fgets ( buffer, sizeof buffer, stdin) != NULL) {
end = buffer;
while ( begin = strchr ( end, '(')) {//get pointer to (
if ( sscanf ( begin, "(%d ,%d", &key, &value) == 2) {//scan ( and two integers
printf("key==%d,value==%d\n",key,value);
}
end = strchr ( begin, ')');//get pointer to )
if ( ! end) {
break;//did not find )
}
}
}
和strspn
strcspn