質問内容
scanfの入力について、指定した文字数以上の文字を入力すると格納できない、つまりはみ出した文字が**「後ろの領域」**に上書きされるということを聞いたことがあり、その後ろの領域というものを知りたいためにコードを組んで実験していたのですが、後ろの領域というのは1つ前に定義した文字ということで間違いはないのでしょうか?
例えば、a、b、cの順番に文字列を定義した場合に、scanfを用いてbに入力した文字列の文字数が、bで定義した文字数を超えている場合は、その分の文字列がaの方に上書きで入力されるという認識で良いのでしょうか。
(C言語は始めたばかりなので、文章が分かりにくければ申し訳ございません。)
コード
example1
1#include<stdio.h> 2 3int main(void) 4{ 5 char a[10] = "aaaaaaaaa"; 6 char b[10] = "bbbbbbbbb"; 7 char c[10] = "ccccccccc"; 8 9 scanf(" %[^,],%s",&b,&c); 10 printf("a=%s\n",a); 11 printf("b=%s\n",b); 12 printf("c=%s\n",c); 13 14}
example2
1#include<stdio.h> 2 3int main(void) 4{ 5 char b[10] = "bbbbbbbbb"; 6 char a[10] = "aaaaaaaaa"; 7 char c[10] = "ccccccccc"; 8 9 scanf(" %[^,],%s",&b,&c); 10 printf("a=%s\n",a); 11 printf("b=%s\n",b); 12 printf("c=%s\n",c); 13 14}
プログラムの実行と結果
それぞれのコードをコンパイルして作成した実行ファイルを実行して、scanfの入力については以下のように記入します。
bb,cccccccccc
するとexample1のコードをコンパイルした方は
a=aaaaaaaaa b=c c=ccccccccccc
と出力されて、example2のコードをコンパイルした方は
bb,ccccccccccc a=c b=bb c=ccccccccccc
と出力されました。
私の考察
example1の方はa,b,cの順番に定義して、まずbにbbが上書き保存されて、その後cに"ccccccccccc\n"を代入しようとするが、"c\n"が溢れてbに再度上書き保存されて、bは最終的に"c\n"と入力されたことになると考えました。
また、example2の方はb,a,cの順番で定義しており、bにbbが上書き保存されて、cに"ccccccccccc\n"を代入しようとするが、"c\n"が溢れてcの1つ前に定義したaに溢れた"c\n"が代入されて、a=cとなったと考えました。
その考察から、質問内容であるscanfで定義された文字数以上の文字を入力すると後ろの領域、つまり1つ前に定義した変数に代入されるのではないかという予想をしています。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/25 16:33