【问题标题】:sscanf to array of structsscanf 到结构数组
【发布时间】:2015-12-30 19:48:42
【问题描述】:

我正在尝试使用 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++;
    }

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

【问题讨论】:

  • 你可以检查sscanf的返回值
  • sscanf为每行返回正确的字数,但你是对的,我仍然应该检查。但是,为什么 &parameters[i].command 是 'unsigned char **' 类型的。第二个指针是从哪里来的?
  • 如果我使用 parameters[i].command 没有 & 程序在编译后的 sscanf 期间崩溃。
  • 参数 3 不是%s,而是%d。你发的问题对吗?你说它工作得很好,但“最终”是这样,但它肯定是编译器警告吗?那么为什么要运行代码呢?
  • 是的,我确实发布了正确的问题。对于参数 2,我得到了相同的警告,实际上也是 %d。所以我必须为数组中的每个指针分配内存?我该如何正确地做到这一点?

标签: c arrays pointers scanf


【解决方案1】:

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

语法错误可以通过以下方式修复:

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

【讨论】:

  • 也许改变sscanf中的格式字符串,这样缓冲区就不会溢出
  • 感谢您的长文。这是我与另外两个人共享的项目,遗憾的是我无法更改 command_t 的类型。 command_t 也保证在 2 - max 之间。 30 个字符。如果我想使用您的第二种方法并使用malloc,我必须在哪里为parameters[i].command 分配内存?在 sscanf 之前?
  • 好的,所以我尝试了以下操作:while(fgets(line, sizeof(line), fp) != 0) { parameters[i].befehl = malloc(sizeof(unsigned char)); sscanf(line, "%s %d %d",parameters[i].befehl,&parameters[i].p1,&parameters[i].p2); i++; printf("\n %s", parameters[i].befehl); } 但是 sscanf 仍然崩溃。我哪里做错了?我必须为整个数组分配内存吗?
  • malloc(sizeof(unsigned char)) 分配内存以仅保存一个字符。使用malloc(100)之类的东西。
  • 该死的,它做到了。想的还不够多,非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多