我在 unix 中运行该程序。它有段错误。我发现它来自 read_names 函数中的 for 循环。当我禁用循环并设置 i = 0 时,它起作用了。但是,当我设置 i = 1 或其他数字时,它再次显示段错误。我认为我存储字符串的方式可能是错误的。谁能帮我解决这个问题?
另外,我可以使用strtok将字符串保存到一个二维数组中吗?
谢谢。
#include <stdio.h>
#include <malloc.h>
#include<string.h>
void alloc(char ***surname, char ***first, char **mid_init, int num);
void read_names(FILE *inp, char ***surname, char ***first, char **mid_init, int num );
void free_memory(char ***surname, char ***first, char **mid_init, int num);
int main(int argc, char *argv[])
{
int num;
char **surname, **first, *mid_init;
FILE *inp = fopen(argv[1], "r");
FILE *outp = fopen(argv[2], "w");
char array[79];
fgets(array, 79, inp);
fgets(array, 79, inp);
fgets(array, 79, inp);
printf("%s", array);
fscanf(inp, "%d", &num);
fprintf(outp, "%d \n\n", num+10);
alloc(&surname, &first, &mid_init, num);
read_names(inp, &surname, &first, &mid_init, num);
free_memory(&surname, &first, &mid_init, num);
fclose(inp);
fclose(outp);
return 0;
}
void alloc(char ***surname, char ***first, char **mid_init, int num)
{
int i;
*surname = (char**)malloc(num * sizeof(char*));
*first = (char**)malloc(num * sizeof(char*));
*mid_init = (char*)malloc(num * sizeof(char));
for(i=0; i<num; i++)
{
(*surname)[i] = (char*)malloc(15*sizeof(char));
(*first)[i] = (char*)malloc(10*sizeof(char));
}
}
void read_names(FILE *inp, char ***surname, char ***first, char **mid_init, int num )
{
char *token, array[79];
char delim[6] = ", .\n";
int i=0/*, k=0*/;
printf("loop begins\n");
for(i=0; i<num; i++)
{
fgets(array, 79, inp);
printf("%s\n", array);
fgets(array, 79, inp);
printf("%s\n", array);
token = strtok(array, delim);
strcpy( *(*(surname+i)+0), token);
printf("%s ", *(*(surname+i)+0));
token = strtok(NULL, delim);
strcpy( *(*(first+i)+0), token);
printf("%s ", *(*(first+i)+0));
token = strtok(NULL, delim);
**mid_init = token[0];
printf("%s\n", *mid_init);
}
printf("\nloop ends\n");
}
void free_memory(char ***surname, char ***first, char **mid_init, int num)
{
int i;
free((*mid_init));
for(i=0;i<num;i++)
{
free((*surname)[i]);
free((*first)[i]);
}
}
最佳答案
您的读取函数应定义为:
void read_names(..., char **surname, char **first, ...)
您将 ***surname
指针传递给 alloc()
函数,因为您正在更改外部变量 surname
。读取函数不执行此操作,它访问内存。
然后替换这个可怕的 :) 代码:
strcpy( *(*(first+i)+0), token);
与
strcpy(*(first+i), token);
更具可读性(如 alk 所建议)
strcpy(first[i], token);
实际上,为了可读性,我建议使用 char *pointer[];
声明。
您使用 strtok
将字符串分隔为标记。使用带有 strtok
的 strcpy 来填充二维数组。
另外,你有内存泄漏。
你需要加入free_memory()
函数
free(*surname);
但是可以通过改变free_function的定义来简化
void free_memory(char **surname, ..., int num)
{
...
for(i=0;i<num;i++)
{
free(surname[i]);
...
}
free(surname);
}
关于c - 如何将字符串转换为二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19922284/