是否可以使用多个格式说明符运行 sscanf,每个格式说明符都会在数组中设置一个项目?目前,我必须分别指定指向每个数组槽的指针,这感觉非常重复:
unsigned int buffer[8];
sscanf(
line,
"%6o %6o %6o %6o %6o %6o %6o %6o",
buffer + 0,
buffer + 1,
buffer + 2,
buffer + 3,
buffer + 4,
buffer + 5,
buffer + 6,
buffer + 7);
我正在寻找类似于 JavaScript 的 spread operator 的东西或Python的*
-operator for unpacking argument lists :
sscanf(
line,
"%6o %6o %6o %6o %6o %6o %6o %6o",
...buffer);
目前,此操作失败并出现以下错误:
file.c:42:21: error: format ‘%o’ expects a matching ‘unsigned int *’ argument [-Werror=format=]
这是预料之中的。如何告诉 sscanf 将每个格式说明符值放入数组中的连续槽中?是否可以?如果没有,是否有一个聪明的解决方法(黑客)?
最佳答案
How can I tell sscanf to put each format specifier value into consecutive slots in the array? Is it possible? If not, is there a clever workaround (hack)?
使用循环。
强大的代码还可以检测行
是否不包含 8 组八进制数字文本。
strtol()
的替代方案循环是 sscanf()
和 "%6o %n"
。
"%n"
扫描可选的空白,然后保存扫描的偏移量。
size_t n = sizeof buffer / sizeof buffer[0]; // 8
const char *p = line;
size_t i;
for (i = 0; i < n; i++) {
int n = 0;
if (sscanf(p, "%6o %n", &buffer[i], &n) != 1) { // or use strtol()
Handle_scanf_failure(); // Add user code here to cope with this error
}
p += n; // Advance p to the next part of the buffer
}
if (*p != '\0') {
Handle_junk_at_end_of_buffer(); // Add user code here to cope with this error
}
strtol()
比 "%o"
更好地处理溢出,但由于我们的最大宽度为 6 个八进制数字,因此使用 32 位无符号
防止溢出。
关于arrays - sscanf 多个格式说明符到单个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70555074/