簡體   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