2015-02-26 40 views
1

我有一個字符串是這樣的:word1;word2;42;word3-,我需要提取由隔板劃分的話,並將其存儲在具有以下結構的結構:子串提取

typedef struct Info { 
    char *info_one; 
    char *info_two; 
    char *info_three; 
    int number; 
} Info; 

爲了獲得的話我寫了這個功能:

char *get_words(char *source, char **dest, const char separator) 
{ 
    int length; 
    char *substring; 

    substring = strchr(source, separator); 
    length = strlen(source) - strlen(substring); 
    (*dest) = (char *) malloc ((length+1) * sizeof(char)); 
    strncpy(*dest, source, length); 
    (*(dest + length)) = '\0'; 
    return substring+1; 
} 

,我調用這個函數從主這樣的:

int main(int argc, char *argv[]) { 
    Info *info; 
    char *number; 
    char *substring; 
    char *stringinfo = "dog;cat;12;elephant-"; 

    info = (Info *) malloc (sizeof(Info)); 
    substring = stringinfo; 

    substring = get_words(substring, &info->info_one, ';'); 
    substring = get_words(substring, &info->info_two, ';'); 
    // -------- 
    substring = get_words(substring, &number, ';'); 
    info->number = atoi(number); 
    // -------- 
    substring = get_words(substring, &info->info_three, '-'); 

    return 0; 
} 

我的問題是這段代碼在處理提取「數字部分」後剩餘的子字符串時會生成段錯誤。如果我沒有在字符串中輸入數字,顯然,我沒有調用函數來提取它,但一切都運行平穩。我無法弄清楚什麼是錯誤的,你能幫我抓住錯誤嗎?

+0

這裏看看http://stackoverflow.com/questions/266357/tokenizing-strings-in-c –

+1

注意'*(dest + length)'與'dest [length]'完全一樣。 – fuz

回答

2

您使用的是局部變量:

(*(dest + length)) = '\0'; 

必須

(*(*dest + length)) = '\0';