strcat
引数をヌル終了文字列へのポインタとして扱います。char
aを a にキャストするのchar *
は危険であり、それが有用であるとは思えません (それを試すのが愚かだと言っているわけではありません。誰もが学ぶときにばかげた間違いを犯します。それが私たちがここにいる理由です)。
その理由は、1 バイトchar
に加えて、それを囲む余分なsizeof(char*) - sizeof(char)
(通常は 3) バイトをchar
ポインターとして解釈し、それが ... を指すためです。これらのバイトのうち 3 バイトは制御できないため、有効なデータを指しているかどうかを知る方法はありません。
これを 2 番目のアプローチとして使用できます。
strcat(inp, &c);
今回&c
は、 は型の式char *
であり、キャストは必要ないため、うまくいくでしょう。しかし、繰り返しにstrcat
なりますが、引数がヌルで終わる文字列であると仮定します。データの後にヌルバイトを保証する方法がないためchar
、これはうまくいきません。
最良の方法はこれです:
size_t len = strlen(inp); // this may already be calculated somewhere else
...
inp[len++] = c; // add c as the last character, and adjust our len
inp[len] = '\0'; // add a new nul terminator to our string
アップデート:
実は嘘をつきました。最善の方法は、標準ライブラリの function を使用するfgets
ことです。これは、多かれ少なかれ、あなたがしようとしていることを実行しているように見えます。正直なところ忘れていましたが、これが宿題である場合、fgets
手動で行う方法を学べるように、教授は使用を望まないかもしれません。ただし、これが宿題でない場合は、fgets
探していることを正確に実行します。(実際には、3 番目のアプローチは、機能の再実装fgets
またはfgets
類似の機能に向けて順調に進んでいます。)
input
また、関数に関する他のコメントも追加します。
char* inp = "";
読み取り専用データを指します。C標準の欠陥(後方互換性のため)により、文字列リテラルをchar*
型ではなく型に割り当てることができますconst char *
(IMHO)。
これにはいくつかの方法がありますが、最適なのは動的割り当てです。関数を使用してmalloc
一部のデータを予約し、関数で使用した量を追跡し、保存するためrealloc
により多くのスペースが必要になった場合に関数を使用します。ヘルプが必要な場合は、別の質問で (できればすぐに)ここに戻ってくると思います。:)
getchar()
は a の通常の範囲外に定義されているint
ため、 を返します。とを区別するには、を. そうしないと、完全に有効な文字が. ただし、文字列に追加するときは必ず a にキャストしてください。EOF
char
char
EOF
c
int
EOF
c
char