[解決済み] C言語で%sを正しく使う - 超基本レベル
質問
sが文字列であることは知っていますが、使い方がわかりません。 どのように使用するのか、またcharとどのように違うのか、どなたか基本的な例を教えていただけませんか?
(編集)
私はこのコースを始めて2週間目になります。まだ習っていないことを課題に使うことは許されないので、そのために質問しました。C言語の本は何冊か持っていて、ググってみたのですが、それでもよくわからなかったので質問させていただきました。(たくさんの反対票ありがとうございました) 以下に示された例はすべてまだ教えられていない配列を使用しているので、私はまだ%sも使用できないと仮定しています。ありがとうございます。
どのように解決するのですか?
両方の場合
*printf
と
*scanf
,
%s
は、対応する引数の型が
char *
であり、また
scanf
の場合、書き込み可能なバッファ(つまり文字列リテラルではない)を指すようにしなければなりません。
char *str_constant = "I point to a string literal";
char str_buf[] = "I am an array of char initialized with a string literal";
printf("string literal = %s\n", "I am a string literal");
printf("str_constant = %s\n", str_constant);
printf("str_buf = %s\n", str_buf);
scanf("%55s", str_buf);
使用方法
%s
で
scanf
フィールド幅を明示しない場合、以下のようなバッファオーバーフローが発生します。
gets
つまり、ターゲットバッファが保持できるサイズよりも多くの文字が入力ストリームに存在する場合です。
scanf
はその余分な文字を喜んでバッファの外のメモリに書き込むので、重要なものを壊してしまう可能性があります。 残念ながら
printf
を実行時の引数として与えることはできません。
printf("%*s\n", field_width, string);
フォーマット文字列を動的に構築するのも一つの方法です。
char fmt[10];
sprintf(fmt, "%%%lus", (unsigned long) (sizeof str_buf) - 1);
...
scanf(fmt, target_buffer); // fmt = "%55s"
EDIT
使用方法
scanf
と共に
%s
変換指定子は,最初の空白文字でスキャンを停止します。例えば,入力ストリームが次のような場合です。
"This is a test"
では
scanf("%55s", str_buf)
を読み込んで割り当てます。
"This"
を
str_buf
. この場合、指定子付きのフィールドは違いをもたらさないことに注意してください。
関連
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
[解決済み] C言語による配列の返送
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] C言語でランダムなint型を生成するには?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する
-
[解決済み】なぜこれらのコンストラクトはプリインクリメントとポストインクリメントを使用して未定義の動作をしているのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
C++の配列コピー
-
initializer element is not constant "というエラーが表示されるのですが?
-
未定義の `__isoc99_sscanf' への参照
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?