2012-10-31 114 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分配內存和*雙峯