1

我正在编写一个小型 C 程序来测试一个概念,但我遇到了一些问题。首先,这是我的所有代码:

#include <stdio.h>
#include <string.h>

char one[] = "Figure A 200 200 =\0";
char two[] = "Figure B 300 200 =\0";

int main(void)
{
  char buffero[300];
  char buffert[300];
  memset(buffero, 0, sizeof(buffero));
  memset(buffert, 0, sizeof(buffert));

  int * doubleo = 0;
  int * doublet = 0;

  sscanf(one, "%s %s %d %d ",buffero, buffert, doubleo, doublet);
  printf("%s %s %d %d", buffero, buffert, *doubleo, *doublet);

  memset(buffero, 0, sizeof(buffero));
  memset(buffert, 0, sizeof(buffert));

  sscanf(two, "%s %s %d %d ", buffero, buffert, doubleo, doublet);
  printf("%s %s %d %d", buffero, buffert, *doubleo, *doublet);
};

它与我尝试实施的一些修复程序有些复杂,但并不是那么可怕。

它编译,但是当我运行它时,我得到一个分段错误。

GDB 报告:

#3  0x0000000000400683 in main () at mis_test.c:15
15    sscanf(one, "%s %s %d %d ",buffero, buffert, doubleo, doublet);

有人可以在这里提供一些见解吗?我对 C 相当陌生,我知道这是一个非常非常简单的问题,正盯着我看,但我似乎无法理解。任何帮助表示赞赏。

4

3 回答 3

6

这是因为您使用的是尚未分配内存的 int 指针。

 int * doubleo = 0;
 int * doublet = 0;

您可以简单地使用两个整数:

 int doubleo = 0;
 int doublet = 0;

然后使用 sscanf 调用 sscanf ,&因为 sscanf 需要指向整数的指针:

  sscanf(one, "%s %s %d %d ",buffero, buffert, &doubleo, &doublet);

请注意,您不需要自己终止字符串。它由编译器为您完成。

于 2012-10-31T21:52:46.453 回答
0

Try this :

#include <stdio.h>
#include <string.h>

char one[] = "Figure A 200 200 =\0";
char two[] = "Figure B 300 200 =\0";

int main(void)
{
   char buffero[300];
   char buffert[300];
   memset(buffero, 0, sizeof(buffero));
   memset(buffert, 0, sizeof(buffert));

   int doubleo = 0;
   int doublet = 0;

   sscanf(one, "%s %s %d %d ",buffero, buffert, &doubleo, &doublet);
   printf("%s %s %d %d", buffero, buffert, doubleo, doublet);

   memset(buffero, 0, sizeof(buffero));
   memset(buffert, 0, sizeof(buffert));

   sscanf(two, "%s %s %d %d ", buffero, buffert, &doubleo, &doublet);
   printf("%s %s %d %d", buffero, buffert, doubleo, doublet);
};

Or allocate memory for *doubleo and *doublet

于 2012-10-31T21:57:01.753 回答
0

For 格式说明符%d sscanf需要指向类型的接收对象的指针int。您提供了无处指向的指针(空指针)。这就是导致崩溃的原因。

如果您坚持使用显式指针,首先您必须确保它们指向有效int对象

int io, it;

int * doubleo = &io;
int * doublet = &it;

sscanf将数据读入ioit对象

sscanf(one, "%s %s %d %d ", buffero, buffert, doubleo, doublet);

当然,这里没有真正需要这些显式指针。你可以完全摆脱doubleodoublet

sscanf(one, "%s %s %d %d ", buffero, buffert, &io, &it);
于 2012-10-31T21:54:45.370 回答