40章 printfの詳細

http://www.geocities.jp/ky_webid/c/040.html

フォーマット指定子の一覧が載っています。

何度も使うことになると思うので覚えれるだけ覚えておきましょう。

フォーマット指定子 意味
%d / %i 符号付き10進整数
%u 符号なし10進整数
%o 符号なし8進整数
%x 符号なし16進整数(小文字)
%X 符号なし16進整数(大文字)
%f 10進数の浮動小数点数
%e 科学的記数法による浮動小数(小文字)
%E 科学的記数法による浮動小数(大文字)
%g %fと%eの短い方
%G %fと%Eの短い方
%c 文字
%s 文字列
%p ポインタ
%n 出力された文字数を取得
%% %記号を出力

出力変換仕様

出力するときに変換をかけることができます。%2dの2の部分にあたるやつですね。

%[フラグ][最小フィールド幅][精度][変換修飾子]フォーマット指定子

の部分は省略可能です。の付いていない部分だけを取り出すと、%フォーマット指定子 となります。これが最小の形なのです。

しっかり覚えましょう。指定できるフラグは以下の表です。

フラグ 意味
+ +-の符号付きで出力
空白 正数のとき先頭に空白を付ける
- 左詰めで出力
# 表記法に従った形式で出力
0 足りない桁に0を詰めて出力

問題1

キーボードから10文字以内の文字列を入力させ、最初の7文字まで表示させるプログラムを作って下さい。

さっそくですね。やってみます!

int main () {
    char str[11];
    
    fgets(str,sizeof(str),stdin);
    printf("%.7s",str);
    
    return 0;
}
$ main
1234567890
1234567

できました。簡単ですね。

問題2

0000〜1000の数字コードの連番を、4桁表記で出力するプログラムを作って下さい。

これも簡単だと思います。

int main () {
    int i;
    for(i=0;i<1001;++i){
        printf("%04d\n",i);
    }
    return 0;
}
$ main
0000
0001
0002
0003
0004

(中略)

0996
0997
0998
0999
1000

ちょっと行数が多すぎるので途中省略しました。うまくいってるようですね。

問題3

3.141592という浮動小数の出力を、小数点以下の表示桁数0から8までの9パターンを試すプログラムを作って下さい。for文によるループを利用して、1つのprintf関数だけで9パターン全て出力するようにして下さい。

ちょっとまた問題文の誤読しそうな感じはしますがやるだけやってみます。

int main () {
    int i;
    double pi = 3.141592;
    
    for(i=0;i<9;++i){
        printf("%.*f\n",i,pi);
    }
    
    return 0;
}
$ main
3
3.1
3.14
3.142
3.1416
3.14159
3.141592
3.1415920
3.14159200

できました!

最初「*」が思い浮かばなくて%.1fとか%.2fとかの文字列を動的に生成しようと頑張っちゃいましたorz