arrays - sscanf 多个格式说明符到单个数组

标签 arrays c pointers scanf

是否可以使用多个格式说明符运行 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/

相关文章:

C++ 一种为成员函数提供 typedef 模板的方法?

java - Java 中的字符串或字符可以递增吗?

PHP ARRAY, 2 foreach, input name =""问题

c - C 中 'switch 0' 语句的目的是什么?

c++ - const int*、const int * const 和 int const * 之间有什么区别?

pointers - vector <list <T >>是否保证元素地址保持不变?

vb.net - 在 vb.net 中如何将数组从一种数据类型转换为另一种数据类型?

通过修改数组中的索引将长线性数据转换为C中的数据

c - 插件系统中的错误代码和消息处理

c - __get_cpuid 的可移植性如何?