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:エラー:割り当てに互換性のないタイプが発生します。また、すべての履歴をシフトして、最新の入力を最初の位置(history [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:nullなど。

その場合、入力は「新規」です

履歴0:新しい履歴1:新しい履歴2:nullなど。

新しい入力が入力されるたびに、文字列シフトへのポインタが移動しますが、これにより、最新の値のみが履歴配列に保存されます。

4

3 に答える 3

4

文字列にスペースを割り当てる必要があります。これはいくつかの方法で行うことができ、2つの主要な候補は次のようになります。

char history[10][100];

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

1つ目は、10文字のバッファをそれぞれ100文字で静的に割り当てます。2つ目は、あなたが書いたように、10個のポインターを文字に静的に割り当てます。動的に割り当てられたメモリ(それぞれ任意の長さである可能性があります)でポインタを埋めることにより、後で文字列を読み取るためのメモリがあります。

于 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";)

これは、配列'input'が文字列"input"を指すようにしようとしたために発生します。配列はconstポインターであるため、これは不可能です(つまり、配列が指す値は変更できません)。

あなたがしようとしていることをする正しい方法は次のとおりです。

strcpy(input,"input");

もちろん、これは小さな問題です。大きな問題はすでに2回投稿されています。ただそれを指摘したかった。

ところで、ターミナルで実行するときにこれをどのようにコンパイルするかさえわかりません。エラーが発生しませんか?たぶんただの警告?-Wall-pedanticでコンパイルしてみてください

于 2010-10-10T20:11:35.690 に答える