我正在尝试使用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",¶meters[i].command,¶meters[i].p1,¶meters[i].p2);
i++;
}
那怎么来&参数[i] .command是双指针? 非常感谢任何解释!
答案 0 :(得分:1)
我在程序中看到了几个错误 - 一个句法和一个语义。
可以使用以下方法修复语法错误:
sscanf(line, "%s %d %d", parameters[i].command, ¶meters[i].p1, ¶meters[i].p2);
// ^^ Remove the &
然而,更大的问题是,在将数据读入之前,您尚未为parameters[i].command
分配任何内存。
有几种方法可以解决这个问题。
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, ¶meters[i].p1, ¶meters[i].p2);
// ^^ Specify the maximum number of characters to read