3

我需要将用户的输入存储到字符串数组中。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *history[10] = {0};

int main (void) {

    char input[256];

    input = "input";

    strcpy(history[0], input);

    return (EXIT_SUCCESS);

}

在终端上运行它我得到一个分段错误,在 NetBeans 中我得到 main.c:11: error: incompatible types in assignment。我还尝试转移所有历史以将最新输入存储到第一个位置(历史 [0])。

history[9] = history[8];
history[8] = history[7];
history[7] = history[6];
history[6] = history[5];
history[5] = history[4];
history[4] = history[3];
history[3] = history[2];
history[2] = history[1];
history[1] = history[0];
history[0] = input;

但这会导致这样的输出。

如果输入是“输入”

历史 0:输入历史 1:空等。

如果然后输入是“新”

历史 0:新历史 1:新历史 2:空等。

每次输入新输入时,指向字符串的指针都会移位,但只会将最新值保存在历史数组中。

4

3 回答 3

4

您需要为字符串分配空间。这可以通过多种方式完成,两个领先的竞争者如下所示:

char history[10][100];

char *history[10];
for (j = 0;  j < 10;  ++j)
    history [j] = malloc (100);

第一个静态分配十个字符缓冲区,每个缓冲区 100 个字符。第二个,如您所写,静态分配十个指向字符的指针。通过用动态分配的内存(每个都可以是任意长度)填充指针,以后有内存可以读取字符串。

于 2010-10-10T20:02:45.343 回答
1

strcpy()不会为字符串分配新的内存区域,它只会将数据从一个缓冲区复制到另一个缓冲区。您需要使用strdup()或创建预先分配的数组 ( char history[10][100];) 分配新缓冲区。在这种情况下,不要尝试移动指针并使用strcpy来复制数据。

于 2010-10-10T20:06:04.643 回答
0
main.c:11: error: incompatible types in assignment
(Code: input = "input";)

发生这种情况是因为您尝试使数组“输入”指向字符串“输入”。这是不可能的,因为数组是一个常量指针(即它指向的值不能改变)。

做你正在尝试的正确方法是:

strcpy(input,"input");

当然这是小问题,大问题已经发过两次了。只是想指出来。

顺便说一句,我不知道你在终端上运行它时是如何编译它的。你没有收到错误吗?也许只是一个警告?尝试使用 -Wall -pedantic 进行编译

于 2010-10-10T20:11:35.690 回答