我正在尝试使用 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++;
}
那么 ¶meters[i].command 为什么是双指针呢? 非常感谢任何解释!
最佳答案
我发现该程序有几个错误——一个是句法错误,一个是语义错误。
可以使用以下方法修复语法错误:
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
关于c - sscanf 到结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34536228/