0

私は次のクラスのために C のスキルを磨いていprintfますgetchar。具体的には、出力しようとする文字列は、各文字に同じ文字シーケンスが追加されます。、および(Xcode)でコンパイルするようにfooなります。この問題を示すサンプル コードを次に示します。"f?8@{?o?8@{?o?8@{?"ccf¿:¿o¿:¿0¿:¿Apple LLVM 5.0

char * input_buffer = malloc( sizeof( char ) );

char c;
while ( ( c = getchar() ) != '\n' ) {
    strcat(input_buffer, &c);
}

// problem output
printf( "\n%s\n", input_buffer );
// foo -> f¿:¿o¿:¿0¿:¿

// weird side effect is the 4 is required to get a proper len
printf("\ncharacters: %lu\n", strlen( input_buffer ) / 4 );

私はどこでも検索しましたが、これは他のどこにも見られませんが、これは少し特殊なケースのようです. これは、私が考慮していないエンコードの問題ですか?

4

3 に答える 3

3

を呼び出すことはできませんstrcat(input_buffer, &c);

に渡される各引数は、strcatヌルで終わる有効な文字列でなければなりません。

次のバイト&cが 0 になる可能性はかなり低いです。

最初のバイトinput_bufferが 0 である可能性もあまり高くありません。

つまり、両方の引数でstrcat0 文字に遭遇するまで「ジャンク」を読み取ります。

変化する:

while ( ( c = getchar() ) != '\n' ) {
    strcat(input_buffer, &c);
}

に:

for (int i=0; 1; i++)
{
    c = getchar();
    if (c == '\r' || c == '\n')
    {
        input_buffer[i] = 0;
        break;
    }
    input_buffer[i] = c;
}
于 2014-01-18T20:15:10.757 に答える
2
  • input_bufferにスペースを1 つだけ割り当てていcharます。
  • strcat(input_buffer, &c);間違っている。文字 (null で終了していない) を文字列と連結しています。
  • getcharは type を返しますintが、宣言したcのは typecharです。
于 2014-01-18T20:13:39.797 に答える