使用sscanf进行分段错误

时间:2012-10-31 21:51:00

标签: c

我正在编写一个小型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很陌生,我知道这是一个非常简单的问题,让我直视我,但我似乎无法得到它。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:4)

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

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

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

 int doubleo = 0;
 int doublet = 0;

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

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

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

答案 1 :(得分:0)

对于格式说明符%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);

答案 2 :(得分:0)

试试这个:

#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);
};

或为* doubleo和* doublet

分配内存