ページ 11

Scanf関数と文字列配列

Posted: 2016年5月07日(土) 17:51
by Ohagi

コード:

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は消えてしまったのかわかりません。
何が起きたのか教えていただけると助かります。

Re: Scanf関数と文字列配列

Posted: 2016年5月07日(土) 18:11
by みけCAT
%[^\n]は文字列を読み込む指定なので'c'と終端の'\0'を書き込みますが、変数cはchar型なので1文字分の領域しかありません。
確保された領域の範囲外にアクセス(読み書き)すると予期せぬ事態になることがあります。
今回はたまたま変数cの直後に変数strが配置されており、strの最初の要素に'\0'が書き込まれたため、文字列が消えたように見えたのでしょう。

Re: Scanf関数と文字列配列

Posted: 2016年5月07日(土) 18:25
by Ohagi
無事理解することができました。

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