2

我有一个由空格分隔的数字组成的输入字符串,例如“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切换到新号码。
我相信应该可以正常工作。我只是不明白为什么它会失败。

4

2 回答 2

5

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

像这样使用它:

int pos;
while (sscanf(s, "%d%n", &d, &pos) == 1) {
    arr[n++] = d;
    s += pos;
}
于 2013-05-28T21:37:55.433 回答
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);
}
于 2013-05-28T21:40:44.050 回答