2014-02-18 23 views
0

我非常努力地尋找解決方案,但我無法想到足夠好的關鍵字。連續調用同一個數組時出現奇怪的seg錯誤

目前我遇到的問題是掌握makeargv背後的概念,它的用法與三重指針(我不知道*** foo是什麼意思,它似乎不像** foo那樣容易理解或者* FOO)。所以我做了我自己:

const char **makeargv(char *string, int *numargs) { 
    string = string + strspn(string, delims); 
    char *copy = malloc(strlen(string) + 1); 
    int i; 
    strcpy(copy, string); 

    int numtokens; 
    if (strtok(copy, delims) != NULL) { 
    for (numtokens = 1; strtok(NULL, delims) != NULL; numtokens++) {} 
    } 

    strcpy(copy, string); 

    const char *results[numtokens+1]; 

    results[0] = strtok(copy, delims); 

    for (i = 1; i < numtokens; i++) { 
    results[i] = strtok(NULL, delims); 
    } 

    results[numtokens+1] = NULL; 
    *numargs = numtokens; 
    return results; 
} 

下面是在它打破了一部分:

void parse_file(char* filename) { 
    char* line = malloc(160*sizeof(char)); 
    FILE* fp = file_open(filename); 
    int i = 0; 
    int numargs = 0; 
    int *pointer = &numargs; 


    while((line = file_getline(line, fp)) != NULL) { 
     if (strlen(line) == 1){ 
     continue; 
     } 

    const char **args = makeargv(line, pointer); 

    printf("%s\n", args[0]); 
    printf("%s\n", args[1]); 
     /* This prints out args[0], but then args[1] causes a seg fault. Even if I replace 
     the args[1] with another args[0] it still causes a seg fault */ 

} 
fclose(fp); 
free(line); 
} 

我有一個字符串的工作陣列。但是,當我嘗試打印出數組中的字符串時,我只能打印出我選擇的一個字符串,然後爲其後的任何調用分段。讓我假裝我的字符串數組是argv [3] = {「是」,「否」,「也許」},如果我打電話給argv [0],它會讓我打電話給「是」,但是任何其他電話我再次調用argv [0])不起作用並導致段錯誤。我可以調用數組中的任何元素,但是一旦我調用其中一個元素,其餘的元素停止工作,導致段錯誤。

請幫忙嗎? d:這是C.

+3

相反的描述,你遇到了什麼,你應該創建內存[一個最小的,完整的,經過測試和讀示例](HTTP:/ /stackoverflow.com/help/mcve)。 –

+0

對不起,我當時正在運輸,因爲我在計算機上遇到了一些複雜和粘貼問題。我現在修好了,現在有機會看看嗎? :d – user3321556

回答

1
const char *results[numtokens+1]; 

此數組「的結果」是一個局部變量,它只是「makeargv」內可用。

你最好使用malloc:

results = malloc(numtokens+1) 

而且我相信有內​​存泄漏在你的代碼。 您將無法釋放的「字符*副本」

char *copy = malloc(strlen(string) + 1); 
1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char **makeargv(char *string, int *numargs) { 
    static const char *delims = " \t\n"; 
    string = string + strspn(string, delims); 
    char *copy = malloc(strlen(string) + 1), *p = copy; 
    strcpy(copy, string); 

    int numtokens; 
    for (numtokens = 0; strtok(p, delims); ++numtokens, p = NULL); 

    char **results = malloc(sizeof(char*)*(numtokens+1)); 
    strcpy(copy, string); 

    int i; 
    p = copy; 
    for (i = 0; i < numtokens; ++i, p = NULL) 
     results[i] = strtok(p, delims); 
    results[i] = NULL; 
    *numargs = numtokens; 
    return results; 
} 

FILE *file_open(char *filename){ 
    FILE *fp = fopen(filename, "r"); 
    if(!fp){ 
     perror("file_open"); 
     exit(1); 
    } 
    return fp; 
} 

void parse_file(char* filename) { 
    char* line = malloc(160*sizeof(char)); 
    FILE* fp = file_open(filename); 
    int i = 0, numargs = 0; 

    while(fgets(line, 160, fp)){ 
     if (*line == '\n') 
      continue; 

     char **args = makeargv(line, &numargs); 
     for(i = 0;i<numargs;++i) 
      printf("%s\n", args[i]); 
     printf("\n"); 

     if(args[0]) 
      free(args[0]); 
     free(args); 
    } 
    fclose(fp); 
    free(line); 
} 

int main(int argc, char *argv[]){ 
    parse_file(argv[1]); 
    return 0; 
} 
相關問題