問題はこちら
No.591 (^o^)/ - yukicoder
言われたとおりにやるだけ
main(){ char a,b; scanf("%c %c",&a,&b);//"%c%c"だと2文字目が得られない(改行の読み飛ばし) printf("(%c%c%c)/",a,b,a); }
読み込みを次のようにまとめることが出来る
a; main(){ gets(gets(&a)+1); printf("(%s%c)/",&a,a); }
50B
aをメインの引数にするとセグフォになる。ぐぬぬ
一応解説。
&aはint*型だが、getsの引数に与えて暗黙にchar*に変換され、入力の1文字がaの下位8bitに入る。ここまではよくやる。
ここでgetsの返り値はchar*なので(実際にはincludeを省略しているのでint!)、+1することにより、aの次の8bitを指すアドレスを得る事ができる。
よって、例えばサンプル1が入力として与えられた場合、gets(gets(&a)+1)が終わった時点でa='^'+'o'*256となっている。
つまり(char*)&aは"^o\0"となっているので、最初の2文字はまとめて出力することができる。
更に、%cで出力する際にint型の変数を渡すと下位8bitのみが使われるので、3文字目もそのまま出力することができる。