2014-02-18 18 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; 
} 
相关问题