[解決済み] C言語で標準入力をEOFまで文字列変数に読み込むには?
質問
を読み込もうとすると、quot;Bus Error"が発生します。
stdin
を
char*
変数を使用します。
を越えてくるものを全部読みたいだけなんです
stdin
で、それをまず変数に入れ、その後、その変数で作業を続ける。
私のコードは以下の通りです。
char* content;
char* c;
while( scanf( "%c", c)) {
strcat( content, c);
}
fprintf( stdout, "Size: %d", strlen( content));
を呼び出すと、なぜかいつも "Bus error" が返されます。
cat test.txt | myapp
ここで
myapp
は、上記のコンパイルされたコードです。
私の質問は、どのように
stdin
EOFまで変数に入れますか?コードにあるように、私はただ標準入力から来る入力のサイズを表示したいだけです。
test.txt
.
を使うだけでいいと思いました。
scanf
を読むためのバッファリングがあれば十分でしょう。
stdin
?
解決方法は?
まず、初期化されていないポインターを渡している、ということです。
scanf
と
strcat
は、自分が持っていないメモリを書き込むことになります。 2つ目は
strcat
はヌル文字で終端する2つの文字列を期待しますが、cは単なる文字です。 これもまた、あなたが所有していないメモリを読み込む原因となる。 実際の処理をしているわけではないので、scanfは必要ない。 最後に、1文字ずつ読むと無駄に遅くなります。 最終的な文字列にはサイズ変更可能なバッファを使用し、fgets呼び出しには固定バッファを使用する解決策の始まりです。
#define BUF_SIZE 1024
char buffer[BUF_SIZE];
size_t contentSize = 1; // includes NULL
/* Preallocate space. We could just allocate one char here,
but that wouldn't be efficient. */
char *content = malloc(sizeof(char) * BUF_SIZE);
if(content == NULL)
{
perror("Failed to allocate content");
exit(1);
}
content[0] = '\0'; // make null-terminated
while(fgets(buffer, BUF_SIZE, stdin))
{
char *old = content;
contentSize += strlen(buffer);
content = realloc(content, contentSize);
if(content == NULL)
{
perror("Failed to reallocate content");
free(old);
exit(2);
}
strcat(content, buffer);
}
if(ferror(stdin))
{
free(content);
perror("Error reading from stdin.");
exit(3);
}
EDIT: Wolferが言及したように、入力にNULLがあると、fgetsを使用する際に文字列が早期に終了してしまいます。 ゲットライン は、メモリ割り当てを処理し、NUL入力の問題がないため、利用可能であれば、より良い選択です。
関連
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み】標準ライブラリを使ってアライメントされたメモリのみを割り当てるには?
-
[解決済み] [Solved] subprocess.Popen に文字列を渡すにはどうしたらいいですか(stdin 引数を使用)?
-
[解決済み】Bashでファイルや標準入力から読み込む方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言