【问题标题】:C - How can I copy one string into an element of character arrays?C - 如何将一个字符串复制到字符数组的一个元素中?
【发布时间】:2018-03-13 05:04:47
【问题描述】:

我正在尝试解析一个文件并拥有一个字符指针数组,其长度是文件中的行数。我想将每一行复制到该数组的一个元素中,但不断出现分段错误。我看不出我做错了什么,所以如果有人可以提供帮助,将不胜感激。这是我的代码。

char * unsplitLines[numLines];
char line[20];
int i;
for(i = 0; i < lines; i++)
{
    fgets(line, 20, fp);
    //printf("%s\n", line);
    unsplitLines[i] = line;
}

gets 函数工作正常,但它之后的赋值导致分段错误。

【问题讨论】:

  • numLines 的值是多少? i 的值是多少?将unsplitLines 中的每个条目设置为指向同一个地方有什么意义?
  • 假设您修复了unsplitLines 的定义(或者已经可以),您仍然需要分配每个unsplitLines[i] 指向的内存。否则,所有条目都指向同一个(相当小的)数组,您只能看到循环后输入的最后一行。考虑 POSIX 函数 strdup() 的优点(或其他优点)。

标签: c


【解决方案1】:

fgets 不为你分配缓冲区,所以unsplitLines 中的所有元素都存储相同的指针line,其内容是文件的最后一行。

试试asprintf

char * unsplitLines[numLines];
char line[20];
int i;
for(i = 0; i < lines; i++)
{
    fgets(line, 20, fp);
    asprintf(unsplitLines[i], "%s", line);
}

【讨论】:

  • 谨慎推荐非标准函数(例如asprintf - These functions are GNU extensions, not in C or POSIX.)推荐strdupstrlenmallocstrcpy,将是标准方式。
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2022-11-30
  • 2019-06-25
  • 1970-01-01
  • 2010-10-27
  • 2012-05-09
相关资源
最近更新 更多