使用sscanf

时间:2019-03-31 10:43:49

标签: c scanf fgets

我是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似乎无法与一行中的第二个元组匹配(或如何匹配)。为什么?还是对我的问题有一些更明智的解决方案?

1 个答案:

答案 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