繁体   English   中英

我在将字符串插入C中的数组时遇到麻烦

[英]I'm having trouble with inserting a string into an array in C

我无法捕获在C中将字符串插入到数组中的错误操作。下面是代码。 printf行向我表明我确实在读取正确的数据-但是在将每行数据粘贴到一个数组中之后,我随后对其进行检查以发现该数组的每个元素都被放入该数组的最后一行填充了。

//代码段

char outbuf[BUFFER_LEN];
int std_out_count = 0;
char *std_out_lines[BUFFER_LEN]; /* Array to hold STDOUT */

while ((i = read(stdout_pipe_fds[0], outbuf, BUFFER_LEN - 1)) > 0) {
  outbuf[i] = '\0';
  char temp[BUFFER_LEN];
  printf("PARENT read from stdout: %s\n", outbuf);
  strcpy(temp, outbuf);
  std_out_lines[std_out_count] = temp;
  std_out_count++;
}

printf("STDOUT_COUNT: %i\n", std_out_count); /* Print out elements of array to make sure they're correct */
int idx;
for(idx = 0; idx < std_out_count; idx++) {
  printf("STDOUT[%i]: %s\n", idx, std_out_lines[idx]);
}

//通过此输出可以看到我正在读取正确的值

/ *从标准输出读取的PARENT:STDOUT =:这是行号0:

从stdout读取的PARENT:STDOUT =:这是行号1:

从stdout读取的PARENT:STDOUT =:这是第2行:* /

//但是当我检查数组的元素时-每个元素都填充有最后一行读取的内容;(

/ * STDOUT_COUNT:3 STDOUT [0]:STDOUT =:这是行号2:

STDOUT [1]:STDOUT =:这是第2行:

STDOUT [2]:STDOUT =:这是第2行:* /

这行:

char *std_out_lines[BUFFER_LEN];

分配字符指针数组,但不为实际数据本身分配任何空间。

稍后,当您这样做时:

char temp[BUFFER_LEN];
printf("PARENT read from stdout: %s\n", outbuf);
strcpy(temp, outbuf);
std_out_lines[std_out_count] = temp;

您实际上是在覆盖每一行的相同内存,并将其(不变)地址存储到下一个字符指针中。 char temp[BUFFER_LEN]; 不会在每次执行时为您提供新的数据区域。

这就是为什么它似乎起作用的原因。 但是,当temp超出范围时,我不建议您尝试检查数组所指向的任何行。 这是不确定的行为。 看来对您有用,但我保证这完全是偶然的:-)

您可能要看的是复制字符串,以便每个数组元素都有自己的副本。 更换:

std_out_lines[std_out_count] = temp;

与:

std_out_lines[std_out_count] = strdup(temp);

或者,完全放弃temp并使用:

std_out_lines[std_out_count] = strdup(outbuf);

这将创建字符串的副本 ,并为您提供用于存储到数组中的字符串的地址,以使它们彼此分开。 请记住,您最终可能应该释放该内存。


在关闭的机会,你的C实现不具备 strdup (它不是由ISO标准规定的), 这里有一个我提前准备

您需要分配一些存储空间,而不是使用temp临时变量。

目前,每次循环时您都在重用temp变量。

使用类似

std_out_lines[i] = malloc(BUFFER_LEN);
// check for null here too, malloc can fail.

您将插入一个指向堆栈分配的缓冲区“ temp”的指针,大多数情况下,它们将是相同的指针。

将您的while循环代码更改为:

  outbuf[i] = '\0';
  printf("PARENT read from stdout: %s\n", outbuf);
  std_out_lines[std_out_count] = strdup(outbuf);
  std_out_count++;

strdup()将为插入std_out_lines数组的字符串分配存储空间,并将outbuf的内容复制到该新字符串中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM