我正在编写一个小型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很陌生,我知道这是一个非常简单的问题,让我直视我,但我似乎无法得到它。任何帮助表示赞赏。
答案 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 = ⁢
sscanf
会将数据读入io
和it
个对象
sscanf(one, "%s %s %d %d ", buffero, buffert, doubleo, doublet);
当然,这里没有真正需要这些显式指针。您可以完全摆脱doubleo
和doublet
并执行
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
分配内存