3

配列内の文字列のセットを読み取りたい。配列のサイズは、実行時に、mallocまたはalloc文字列の数を使用して決定する必要があります。つまり、入力として受け入れられます。次のコードを試しましたが、機能しません。

char *array;
array=(char*)malloc(sizeof(char)*t); //t is the size of array
for(int temp=0;temp<t;temp++)
{
    gets(a[temp]);
}

整数の配列の場合も同じように機能しました。
解決策を見つけるのを手伝ってください。

4

4 に答える 4

5

Cには、文字列を格納するための自動組み込みサポートがなく、「文字列」である変数がなく、適切な文字数を保持するために自動的に拡張できます。自分でメモリを割り当てる必要があります。

あなたが今していることは、適切な数の文字ポインタに場所を割り当てることですが、どの文字にも割り当てません。したがって、gets()呼び出しは割り当てられていないメモリに書き込んでいます。これは未定義の動作です。整数はそれぞれ1つの割り当てに完全に収まるため、同様のコードが整数に対して機能するのはそのためです。文字列はより複雑なので、より多くの作業を行う必要があります。

これらの文字列の長さに既知の上限がある場合は、固定長の一時バッファを使用し、必要なサイズがわかったら、そこから新しく割り当てられた動的メモリにコピーできます。そのような境界がない場合は、固定ブロックを読み取って保存することで同じ概念を繰り返す必要があります。行末が見つからない場合は、別のブロックを読み取り、を使用してこの文字列のメモリ割り当てをrealloc()増やし、新しい文字を追加します。 、および行が終了するまで繰り返します。

gets()ちなみに、バッファオーバーランからプログラムを保護することはサポートされていないため、常に使用を避ける必要があります。同じページに記載されているfgets()を使用することをお勧めします。

于 2012-05-08T09:39:48.500 に答える
1

割り当てるのは、ゼロで終了する形式で格納された、正確に1つの文字列用のスペースです。

複数の文字列の配列を格納する場合は、 PLUSの複数の文字列malloc()の配列を使用する必要があります。char *

また、gets()サイズ制限がないため安全ではありません。代わりに、を使用してfgets()ください。次の署名があります。

char *fgets(char *restrict s, int n, FILE *restrict stream);

ストリームが必要なので、を指定する必要がありますstdin

したがって、1行を読むための最良の方法は

char * read_one_line(uint32_t maxbufsize)
{
    char * s = malloc(maxbufsize);
    if (!fgets(s, maxbufsize, stdin)) {
        free(s);
        return NULL;
    } else {
        char * s2 = realloc(s, strlen(s)+1); // +1 for the NUL at the end
        if (s2) {
            return s2;
        } else {
            return s; // should never happen as the memory block is shrinked
        }
    }
}

この関数は、1行に必要なメモリを割り当て、読み取り後に適切にサイズを変更し、適切な時間に再度解放するために呼び出し元に任せます。

于 2012-05-08T09:39:59.367 に答える
1

char*最初に文字列の配列()にスペースを割り当てる必要があります。

char **array;
array = (char**)malloc(sizeof(char*)*t);

50次に、それぞれにスペースを割り当てる必要があります(これらの文字列の最大文字数にしましょう)。

int i = 0, m = 50;
for (i = 0; i < t; ++i)
    array[i] = (char*)malloc(sizeof(char)*51); // 51 = 50 characters + '\0'

そして、あなたはあなたがやりたいことをすることができます:

for(i = 0; i < t; ++i)
    scanf("%50s", array[i]);

の代わりに、指定された(= 50文字+ )getsで使用することをお勧めします。scanf%50s'\0'

于 2012-05-08T09:42:27.123 に答える
0

最後に、文字配列に文字が存在する必要があることを覚えておいてくださいNUL

したがって、またはt+1でメモリのバイトを割り当てます。allocmalloc

t文字の場合はバイト、終了NUL文字の場合は1バイト。

ループの後for、つまりループの外側に、次のように記述します。

a[temp] = '\0';

その後、あなたはそれを仕事に取り入れることができます。

私はそれがうまくいくことを願っています。

このようになります

char *a = malloc(sizeof((char)*(t+1)));//t is number if characters
int temp;
for(temp=0; temp<t; temp++) {
    gets(a[temp]);
}
a[temp] = 0;

次に配列を出力すると、文字列が取得されます。

printf("%s",a);
于 2012-05-08T09:50:40.057 に答える