C言語printf, scanf

### printfの機能
文字列や変数値を出力する機能
他にもputchar(), puts()などがあるが、printf()でも記述できる。
putchar(ch);
puts(ss);
printf(“%c”, ch);

### printfの変換指定
%o: 8進数出力
%d: 10進数出力
%x: 16進数出力
%X: 16進数出力
%ld: long型数値を10進数で出力
%f: 不動小数点として出力
%e: 指数形式で出力
%E: 指数形式で出力
%c: 文字として出力
%s: 文字列として出力
%p: アドレスを表示

int main(void){
	char c;
	int n;
	long l;
	float f;
	double d;
	char s[20] = "abcde";

	c = 65;
	printf("c: %c\n", c); //文字列
	printf("10: %d\n", c); //10進数
	n = 66;
	printf("c: %c\n", n); //文字列
	printf("10: %d\n", n); //10進数
	n = 1000;
	printf("8: %o\n", n); //8進数
	printf("10: %d\n", n); //10進数
	printf("16x: %x\n", n); //16進数
	printf("16X: %X\n", n); //16進数 英大文字
	l = 1234567890;
	printf("ld: %ld\n", n); //long
	f = 12.34F;
	printf("f: %f\n", n); //浮動小数点数
	printf("e: %e\n", n); //指数形式
	printf("E: %E\n", n); //指数形式 英大文字
	d = 56789.12;
	printf("f: %f\n", d); //浮動小数点数
	printf("e: %e\n", d); //指数形式
	printf("E: %E\n", d); //指数形式 英大文字
	printf("s: %s\n", s); // 文字列
	printf("c=%d n=%d s=%s", c, n, s);

	return 0;
}

### printfのオプション
%d: 必要な幅で出力
%8d: 8文字で出力
%-8d: 左寄せ8文字幅で出力
%2d: 指定値の方が小さくても必要幅は確保
%8X: 先行スペース文字を入れて8文字
%08X: 先行0を入れて8文字出力 ※16進数に便利
%12f: 小数点を入れて12桁
%9.2f:小数点を入れて9桁、小数点以下2桁
%9.f: 整数部のみ9桁

### scanfの機能
scanf()は書式付き入力を行う関数
scanf(書式指定文字列, 変数アドレスの並び);
格納先は変数名ではなく変数のアドレス
※単純変数の場合は&を付け、配列変数の場合は&は不要

### scanfの変数指定
%o: 8進数
%d: 10進数
%ld: long型変数に10進数読み込み
%x: 16進数
%f: float型
%lf: double型変数
%c: 1文字
%s: 文字列

int main(void){
	int i;
	float f;
	double d;
	long l;
	char s[80];

	printf("1文字入力:");
	scanf("%c", &i);
	printf("1文字出力=%c\n", i);

	printf("文字列入力:");
	scanf("%s", s);
	printf("文字列出力=%s\n", s);

	printf("8進入力:");
	scanf("%o", &i);
	printf("10進出力=%d\n", i);

	printf("10進入力:");
	scanf("%d", &i);
	printf("10進出力=%d\n", i);

	printf("16進入力:");
	scanf("%x", &i);
	printf("10進出力=%d\n", i);

	printf("long入力:");
	scanf("%ld", &l);
	printf("long出力=%ld\n", l);

	printf("float入力:");
	scanf("%f", &f);
	printf("float出力=%f\n", f);

	printf("double入力:");
	scanf("%lf", &d);
	printf("double出力=%16f\n", d);

	return 0;
}

$ ./dev
1文字入力:A
1文字出力=A
文字列入力:abc
文字列出力=abc
8進入力:11
10進出力=9
10進入力:9
10進出力=9
16進入力:11
10進出力=17
long入力:1234567890
long出力=1234567890
float入力:12.3456
float出力=12.345600
double入力:123456.78901
double出力= 123456.789010

gets()は空白を含む文字列を読み込むが、scanf()は空白類文字列に出会うと終了

### 標準入力と標準出力
リダイレクトを指示すると、ファイルから入力し、ファイルから出力するようになる
bb.txt // 出力先をbb.txtにする

int main(void){
	char ss[256];

	gets(ss);
	puts(ss);

	return 0;
}

$ ./dev
abcd
abcd
$ ./dev >aa.txt
hogehoge
$ ./dev bb.txt
$ ls
aa.txt bb.txt dev hello.c
$ cat bb.txt
hogehoge

標準出力の意味がここでやっとはっきりしました。