sscanf到struct的数组

时间:2015-12-30 19:48:43

标签: 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++;
    }

那怎么来&参数[i] .command是双指针? 非常感谢任何解释!

1 个答案:

答案 0 :(得分:1)

我在程序中看到了几个错误 - 一个句法和一个语义。

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

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

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

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

  1. 将命令设为固定大小的数组。
  2. 使用malloc为命令分配内存。
  3. 如果你打算使用一些硬编码的数字作为数组的大小,我建议使用第一种方法。然后,您不必担心内存分配和释放。

    更改

    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