c - 如何将字符串转换为二维数组

标签 c arrays

我在 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/

相关文章:

c - 只有某些输入的 C 中的段错误

c - 在 C 中对数组中的值进行排序

C# 连接两个数组的字符串

arrays - 将字符串数组连接到带引号的逗号分隔列表中

c - 在 C 中打印数组

javascript - PHP 中的 HTML 数组字段解析

c - 为什么C程序不能多次运行?

c++ - C++ 是否包括 C99 或 C89?

c - c中数组的问题

ios - NSArray转Swift Array后Array为空