1. ホーム
  2. c

[解決済み] C言語で%sを正しく使う - 超基本レベル

2022-03-15 17:55:13

質問

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);

使用方法 %sscanf フィールド幅を明示しない場合、以下のようなバッファオーバーフローが発生します。 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 . この場合、指定子付きのフィールドは違いをもたらさないことに注意してください。