掲示板ランキング  靴下・ストッキング(五本指の靴下)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7018

printfで固定幅で表示したい
投稿者---chu-(2007/01/18 11:36:58)


環境:bcc32

printfで固定幅で表示しようとしています。
文字列の表示ではうまくいきましたが、数値の表示ではダメでした。
正しい書式指定を、または代用方法をお教えください。

[test.c]
#include <stdio.h>

int main(void)
{
    /* 文字列の表示は左詰めでスペース充填 */
    printf("短|%-5.5s|\n", "123");
    printf("長|%-5.5s|\n", "12345678");

    /* 数値の10進表示は右詰めでスペース充填 */
    printf("短|%5d|\n", 123);
    printf("長|%5d|\n", 12345678);

    /* 数値の16進表示は右詰めでゼロ充填 */
    printf("短|%.5X|\n", 0x123);
    printf("長|%.5X|\n", 0x12345678);

    /* テスト */
    printf("テ|%-5.5d|\n", 12345678);
    printf("テ|%-5.5X|\n", 0x12345678);

    return 0;
}

[出力]
短|123  |       // OK
長|12345|       // OK
短|  123|       // OK
長|12345678|    // NG:|45678|としたい,せめて|12345|としたい
短|00123|       // OK
長|12345678|    // NG:|45678|としたい,せめて|12345|としたい
テ|12345678|
テ|12345678|



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:printfで固定幅で表示したい 7019 akg 2007/01/18 16:49:18
<子記事> Re:printfで固定幅で表示したい 7020 yoh2 2007/01/18 21:58:21
<子記事> Re:printfで固定幅で表示したい 7021 chu- 2007/01/19 11:15:27


No.7019

Re:printfで固定幅で表示したい
投稿者---akg(2007/01/18 16:49:18)


>長|12345678|    // NG:|45678|としたい,せめて|12345|としたい
>長|12345678|    // NG:|45678|としたい,せめて|12345|としたい


指定したフィールド長より出力データ長が長いとき、
自動的に出力フィールドを拡張して、
とにかくデータ全体を出力するようになっていると思います。
したがって、データの一部を出力する際に
書式文字列だけでコントロールすることはできないと思います。


この投稿にコメントする

削除パスワード

No.7020

Re:printfで固定幅で表示したい
投稿者---yoh2(2007/01/18 21:58:21)


正の整数に限った方法ですが、表示したい桁数に合わせて除算をした余りを表示させる
のはいかがでしょう?

    printf("短|%5d|\n", 123 % 100000);
    printf("長|%5d|\n", 12345678 % 100000);

    printf("短|%05X|\n", 0x123 % 0x100000);
    printf("長|%05X|\n", 0x12345678 % 0x100000);


実数や負の整数も扱いたければ、sprintf()で一度文字列にしたものに手を加えるとか。


この投稿にコメントする

削除パスワード

No.7021

Re:printfで固定幅で表示したい
投稿者---chu-(2007/01/19 11:15:27)


返信ありがとうございます。

> 書式文字列だけでコントロールすることはできないと思います。

なるほど、わかりました。

> 正の整数に限った方法ですが

言われて負の値への考慮を忘れていることに気づいたので、表示条件に"符号付で"を追加しました。

以下のように、期待通りの結果を得ることができました。

[test.c]
#include <stdio.h>

int main(void)
{
    /* 文字列の表示は左詰めでスペース充填 */
    printf("|%-5.5s|\n", "123");
    printf("|%-5.5s|\n", "12345678");

    /* 符号無し数値の10進表示は右詰めでスペース充填 */
    printf("|%5u|\n", 123      % 100000);
    printf("|%5u|\n", 12345678 % 100000);

    /* 符号有り数値の10進表示は符号付で右詰めでスペース充填 */
    printf("|%+5d|\n", +123      % 10000);
    printf("|%+5d|\n", +12345678 % 10000);
    printf("|%+5d|\n", -123      % 10000);
    printf("|%+5d|\n", -12345678 % 10000);

    /* 数値の16進表示は右詰めでゼロ充填 */
    printf("|%05X|\n", 0x123      & 0xFFFFF);
    printf("|%05X|\n", 0x12345678 & 0xFFFFF);

    return 0;
}

[出力]
|123  |
|12345|
|  123|
|45678|
| +123|
|+5678|
| -123|
|-5678|
|00123|
|45678|



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ