我输入的字符串由空格分隔的数字组成,如" 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
转换为新号码。
我认为应该可以正常工作。我根本不明白为什么会失败。
答案 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);
}