C 连续调用同一阵列时出现奇怪的seg错误
我真的很努力地寻找一个解决方案,但我想不出足够好的关键字 目前,我很难理解makeargv背后的概念以及它与三点指针的用法(我不知道***foo是什么意思,它似乎不像**foo或*foo那样容易理解)。所以我做了我自己的:C 连续调用同一阵列时出现奇怪的seg错误,c,arrays,string,fault,C,Arrays,String,Fault,我真的很努力地寻找一个解决方案,但我想不出足够好的关键字 目前,我很难理解makeargv背后的概念以及它与三点指针的用法(我不知道***foo是什么意思,它似乎不像**foo或*foo那样容易理解)。所以我做了我自己的: const char **makeargv(char *string, int *numargs) { string = string + strspn(string, delims); char *copy = malloc(strlen(string) + 1);
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;
}
我有一个字符串的工作数组。但是,当我试图打印出数组中的字符串时,我只能打印我选择的1个字符串,然后它会为任何后续调用设置故障。让我们假设我的字符串数组是argv[3]={“Yes”、“no”、“maybe”},如果我调用argv[0],它将允许我调用“Yes”,但任何其他调用(即使我再次调用argv[0])都不起作用并导致segfault。我可以调用数组中的任何元素,但一旦调用其中一个元素,其余元素就会停止工作,从而导致错误
请帮忙?D:这是C
const char *results[numtokens+1];
此数组“results”是一个局部变量,它仅在“makeargv”内部可用
您最好使用malloc:
results = malloc(numtokens+1)
我相信你的代码中有内存泄漏。
您将无法释放“char*copy”的内存
#包括
#包括
#包括
char**makeargv(char*string,int*numargs){
静态常量char*delims=“\t\n”;
string=string+strspn(string,delims);
char*copy=malloc(strlen(string)+1),*p=copy;
strcpy(副本,字符串);
国际努姆托克斯;
for(numtokens=0;strtok(p,delims);+numtokens,p=NULL);
char**results=malloc(sizeof(char*)*(numtokens+1));
strcpy(副本,字符串);
int i;
p=副本;
对于(i=0;i 对于(i=0;i)您应该创建,而不是描述您遇到的问题。很抱歉,当时我在运输途中,因为在我使用的计算机上,由于某种奇怪的原因,我在复制和粘贴方面遇到了问题。我现在已经修复了它,您现在可以看一下吗?:D
results = malloc(numtokens+1)
char *copy = malloc(strlen(string) + 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;
}