scanfの%s と guts関数

コンピュータの中央処理装置と入出力装置の間における情報のやり取りは、 ほとんどが文字を使った情報で行われます。 標準入力(stdin)への入力元も例外ではありません。
つまり、押したキーの文字コードの番号が 標準入力バッファと呼ばれる 内部のchar型記憶場所に記憶されます。
そして、scanfや、getchar、そしてguts関数は、 標準入力バッファ が空の場合だけ入力待ちになり、このバッファに記憶された内容を読み取ります。

scanfの%s

scanfは、第1引数の指定に従って、このバッファ内を走査(scan)し、 %直後の指示に従って文字の並びを取り出して動作します。
%c以外の指定(%d, %lf, %s)は、すべてバッファにある 半角スペースやtab や Enterの改行文字 を取り除いてから、バッファ内にある文字並びを取り出して処理します。
(半角スペースやtab や Enterの改行文字は、空白文字と呼ばれます)

%sはバッファにある空白文字を取り除いてから、 バッファ内にある文字並びをバッファから取り出して、引数のアドレスが指し示す 記憶位置から順番に記憶し、最後に文字列終端の'\0'をセットします。
つまり、空白文字で区切られる文字列入力用に使われます。
よって対応する引数には、入力される文字並びとその文字列終端'\0'を 記憶できる十分なサイズの記憶域(配列など)を用意して、そのアドレスを指定しなければ なりません。

gets関数

scanfの%sと違い、空白文字を含めた1行の文字列入力用に使われます。

プログラム実行結果
#include<stdio.h>                                  
main()
{
	char a[20];
	gets(a);
	printf("入力文字列は%sです。\n", a);
	gets(a);
	printf("入力文字列は%sです。\n", a);
}
                                   

123abc
入力文字列は123abcです。
  123    abc
入力文字列は  123    abcです。