1

char配列を取り込んで、stdinから読み取った文字列に設定する関数/メソッドが必要です。最後に読み取った文字をリターンタイプとして返​​す必要があるため、行の終わりに到達したのか、ファイルマーカーの終わりに到達したのかを判断できます。

これが私がこれまでに持っているものであり、私はここからのコードに基づいています

更新:変更しましたが、テキストの後にEnterキーを押すとクラッシュします。この方法は非効率的であり、charはEOFチェックに最適ではないことを私は知っていますが、今のところ、文字列を返すように取得しようとしています。私はそれをこの方法で行うために必要であり、他の方法では必要ありません。文字列は行の正確な長さである必要があり、改行またはEOFintのいずれかである値を返す必要があります。これはchar値で引き続き使用できると思います。

このプログラムはC++ではなくCです

char getLine(char **line);

int main(int argc, char *argv[])
{
    char *line;
    char returnVal = 0;

    returnVal = getLine(&line);
    printf("%s", line);

    free(line);

    system("pause");
    return 0;
}

char getLine(char **line) {
    unsigned int lengthAdder = 1, counter = 0, size = 0;
    char charRead = 0;

    *line = malloc(lengthAdder);
    while((charRead = getc(stdin)) != EOF && charRead != '\n')
    {
        *line[counter++] = charRead;
        *line = realloc(*line, counter);
    }

    *line[counter] = '\0';

    return charRead;
}

よろしくお願いします!

4

3 に答える 3

2

malloc()の結果をのローカルコピーに割り当てているlineので、getLine()関数が返された後は変更されません(変更されていると思いますが)。あなたがしなければならないことは、それを返すか(出力パラメータを使用するのではなく)、そのアドレスを渡す(「参照によって」渡す)ことです:

void getLine(char **line)
{
    *line = malloc(length);

    // etc.
}

そしてそれをこのように呼びます:

char *line;
getLine(&line);
于 2012-09-29T22:52:51.757 に答える
0

使い方reallocが正しくありません。それが戻るNULLと、メモリブロックは失われます。

reallocこのように使用することをお勧めします。

char *tmp;
...
tmp = realloc(line, counter);
if(tmp == NULL)
   ERROR, TRY TO SOLVE IT
line = tmp;
于 2012-09-29T23:00:40.267 に答える
0

重要な問題は、ラインポインタ値がgetLine()関数から伝播されないことです。解決策は、代わりに関数へのポインタへのポインタをパラメータとして渡すことです-getLine(&line);関数がパラメータを取るように定義されている間にそれを呼び出すようにchar **line関数では、現在lineを操作しているすべての場所で、代わりに* lineを操作します。つまり、ポインターをポインターに間接参照し、ポインターがつながるmain()の変数の値を操作します。これがあまり混乱しないことを願っています。:-)一枚の紙に描いてみてください。

(トリッキーな部分-最初に文字列へのポインタを逆参照する必要があり、次に文字列内の特定の文字にアクセスする必要があるため、に変更line[counter]する必要があります。)(*line)[counter]

コードには他にもいくつか問題があります。

  • charReadのタイプとしてcharを使用します。ただし、EOF定数はcharを使用して表すことはできません。charReadの型とgetLine ()の戻り値の両方としてintを使用する必要があります。これにより、実際に改行とファイルの終わりを区別できます。
  • getLine()関数から読み取った最後の文字を返すのを忘れました。:-)
  • 文字を追加するたびに、バッファを再割り当てします。これはそれほど効率的ではないため、かなり醜いプログラミング手法です。別の変数を使用して割り当てられたスペースの量を追跡することはそれほど難しくありません。次に、(i)適切なメモリチャンク(64バイトなど)の割り当てから開始します。これにより、理想的には再割り当てされないようになります。カウンターと割り当てサイズトラッカーの比較に基づく必要があります。2つの再割り当て戦略が一般的です。割り当てのサイズを2倍にするか、固定ステップで割り当てを増やします。
于 2012-09-29T23:02:25.463 に答える