迭代地使用sscanf解析字符串输入

时间:2013-05-28 21:33:04

标签: c scanf

我输入的字符串由空格分隔的数字组成,如" 12 23 34"。
输出应该是整数数组。

我尝试了以下内容:

while (sscanf(s, "%d", &d) == 1) {
    arr[n++] = d;
}

但我发现因为我没有从文件中读取(自动调整偏移量),所以 我每次都会在d中保存相同的号码。

然后我尝试了这个:

while (sscanf(s, "%d", &d) == 1) {
    arr[n++] = d;
    s = strchr(s, ' ');
}

手动将s转换为新号码。
我认为应该可以正常工作。我根本不明白为什么会失败。

2 个答案:

答案 0 :(得分:5)

scanf提供了一个优雅的答案:%n转换,它告诉您到目前为止已消耗了多少字节。

像这样使用:

int pos;
while (sscanf(s, "%d%n", &d, &pos) == 1) {
    arr[n++] = d;
    s += pos;
}

答案 1 :(得分:2)

第二个技巧确实应该稍作修改。请参阅代码中的注释,以了解需要更改的内容:

while (sscanf(s, "%d", &d) == 1) {
    arr[n++] = d;
    s = strchr(s, ' ');
    // strchr returns NULL on failures. If there's no further space, break
    if (!s) break;
    // Advance one past the space that you detected, otherwise
    // the code will be finding the same space over and over again.
    s++;
}

标记数字序列的更好方法是strtol,它可以帮助您在读取下一个整数后推进指针:

while (*s) {
    arr[n++] = strtol(s, &s, 10);
}