Scanf関数と文字列配列

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ohagi
記事: 31
登録日時: 3年前

Scanf関数と文字列配列

#1

投稿記事 by Ohagi » 3年前

コード:

int main(void)
{
  char str[128];
  char c;
  
  puts("入力された文字列str[128]内の文字cが含まれている個数を調べます。");
  printf("str = ");  scanf("%[^\n]%*c", str);
  printf("debug: str = %s\n", str);
  printf("c = ");  scanf("%[^\n]%*c", &c);
  printf("debug: c = %c\n", c);
  printf("debgu: str = %s\n", str);
/*--- 結果(始) ---*/
str = helloworldccc
str = helloworldccc
c = c
c = c
str =
/*--- 結果(終) ---*/

char型の配列strが途中で消えてしまいました。
cの取得をscanfではなく"c = getchar();"とすると問題はなくなりました。
なぜstrは消えてしまったのかわかりません。
何が起きたのか教えていただけると助かります。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: Scanf関数と文字列配列

#2

投稿記事 by みけCAT » 3年前

%[^\n]は文字列を読み込む指定なので'c'と終端の'\0'を書き込みますが、変数cはchar型なので1文字分の領域しかありません。
確保された領域の範囲外にアクセス(読み書き)すると予期せぬ事態になることがあります。
今回はたまたま変数cの直後に変数strが配置されており、strの最初の要素に'\0'が書き込まれたため、文字列が消えたように見えたのでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Ohagi
記事: 31
登録日時: 3年前

Re: Scanf関数と文字列配列

#3

投稿記事 by Ohagi » 3年前

無事理解することができました。

回答ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る