c - sscanf 到结构数组

标签 c arrays pointers scanf

我正在尝试使用 sscanf 将一行格式化文本复制到一个结构数组中。

现在一切正常,但我最终收到了这个警告:

格式“%s”需要类型为“char *”的参数,但参数 3 的类型为“unsigned char **”。

这些是我想使用的 typedef:

 typedef unsigned char* command_t;
 typedef struct {
    command_t command;
    int p1;
    int p2;
} parameters_t;

这是代码的相关部分:

    paramters_t parameters[100];

    while(fgets(line, sizeof(line), fp) != 0) {
      sscanf(line, "%s %d %d",&parameters[i].command,&parameters[i].p1,&parameters[i].p2);
      i++;
    }

那么 ¶meters[i].command 为什么是双指针呢? 非常感谢任何解释!

最佳答案

我发现该程序有几个错误——一个是句法错误,一个是语义错误。

可以使用以下方法修复语法错误:

sscanf(line, "%s %d %d", parameters[i].command, &parameters[i].p1, &parameters[i].p2);
//                      ^^ Remove the &

但是,更大的问题是在将数据读入之前您没有为 parameters[i].command 分配任何内存。

有几种方法可以解决这个问题。

  1. 使命令成为一个固定大小的数组。
  2. 使用 malloc 为命令分配内存。

如果您打算对数组的大小使用一些硬编码数字,我建议使用第一种方法。然后,您不必担心内存分配和释放。

改变

typedef unsigned char* command_t;

typedef unsigned char command_t[100]; // Make it large enough for your need.

确保防止读入命令它可以容纳的更多字符。

sscanf(line, "%99s %d %d", parameters[i].command, &parameters[i].p1, &parameters[i].p2);
//             ^^ Specify the maximum number of characters to read

关于c - sscanf 到结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34536228/

相关文章:

c - 链接列表元素未显示

javascript - 返回数组 Javascript 的前 n 个元素

c - C99 中那些奇怪的数组大小 [*] 和 [static] 是什么?

arrays - 如何为函数的通用数组参数(而不是其 Generator.Element)添加类型约束(协议(protocol)一致性)

c++ - 在嵌套的 lambda 中按值捕获指针会导致段错误

c - 如何为 char** str 设置空值

c - 为什么某些 C 程序使用箭头运算符来指向结构的一部分而不是直接引用?

c - 如何在 C 中完成这项任务?第2部分

c - GDK交叉编译错误

c - 后缀 "_t"在 C 中代表什么?