如何将字符串strcpy成二维数组

时间:2013-11-12 06:20:12

标签: 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]);
  }
}

1 个答案:

答案 0 :(得分:0)

首先,代码错过了所有相关系统调用的错误检查:

  • fopen()
  • fgets()
  • fscanf()
  • malloc()

Also do not cast the result of malloc/calloc/realloc as in C it is not necessary or recommanded.


现在主要问题:

更改

strcpy( *(*(surname+i)+0), token);

strcpy((*surname)[i]), token);

使用first的方式相同。


这一行

**mid_init = token[0];

没有意义,因为你将一个指针保存到函数本地分配的内存中,只要该函数被删除就会无效。


free_memory()添加

free(*surname);
free(*first);
循环后

以避免内存泄漏。