2012-10-31 112 views
1

我正在写一个小型的C程序来测试一个概念,我有一些问题。首先,这里是我的所有代码:sscanf分段错误

#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

你'double'指针为NULL。他们需要有效的int值。将它们更改为'int'并将它们的*地址*传递给sscanf调用ex:'&doubleo' – WhozCraig

回答

3

这是因为您使用的是没有分配内存的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); 

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

0

对于格式说明符%dsscanf需要指向类型为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); 
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分配内存和*双峰