将字符串存储在 C 的 char 数组中——我做错了什么?

Store string in char array in C -- What am I doing incorrectly?

我正在从 getline() 中检索一个字符串,如下所示:

length = getline(&line, &linecap, stdin);

此字符串包含空格。

然后我将这一行插入数组中:

char *history[10];
history[0]=line;

然后我从数组中打印这个条目的内容:

printf("\nHISTORY[%d] = %s", 0, (history[0]));

问题是只有第一个词被打印到屏幕上。似乎只有第一个单词实际存储在数组中。

如果例如行 = "This is such a great line"。然后我将这一行插入到历史数组中,但只有 "This" 这个词从我的 printf.

中打印出来

我做错了什么?

你不能写history[0] = line。您需要使用 strcpy:

strcpy(history[0], line)

第一个参数是目的地,第二个参数是源。但是,您没有为 history 中的任何元素分配 space。它们只是不指向有效区域的指针。你可以通过

解决这个问题
for (i = 0; i < 10; ++i)
    history[i] = malloc(strlen(line) + 1);

现在您可以复制到history[i]

完成后,必须释放内存

for (i = 0; i < 10; ++i)
    free(history[i]);

但是 strcpy 的问题是,如果目标中没有足够的 space,就会发生缓冲区溢出。要解决此问题,请重写 strcpy 以接受长度。

void mystrcpy(char *dest, char *src, size_t n)
{
    size_t i;
    for (i = 0; i < n && *dest++ = *src++; ++i)
        ;
    dest[i] = 0;
}

以上函数只复制srcdest的前n个字符。这是一个进步。