• ベストアンサー

printf系の書式「w」ってなに?

Solaris上で動いているプログラムで以下のような記述があり、 これをLinuxで実行すると動きが異なります。 (Linuxでは"%02wd"という文字列が出力されてしまう。) 「w」ってどのような時につかうものでしょうか? また、このような書き方は有効なのでしょうか? char shelf_number[8]; int slot_number; sprintf(number_bf,"%s%02wd",shelf_number,slot_number);

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

おっととと. よく見たら, 対応するのは int じゃないか.... ということは単に %d が正解だなぁ, 多分. まあ int = long という (よくある) 環境では %ld と %d に違いはないわけですが. あ, そうそう, ISO C だとこ~いうときは undefined behavior となってます (規定されているといえば規定されている). つまり, 「どんなことになろうと他者に文句をいってはいけない」ってことですね.

ari_els
質問者

補足

みなさま、回答ありがとうございます。 やっぱり、書き間違いですかね。。。

その他の回答 (3)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

ISOで%lsとするべきところはVC等でも%wsだったりしますので、 Solarisもそうなんだろうなぁという憶測はありますが…。 > まあ, %wd とかやってることから推測すると, もしかすると %ld としたかったのかなぁとか思います. 多分、これなんだろうなぁと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「普通は」というか, 「規格に従ってプログラムを作っている限り」使わない, ですね. おそらく Solaris (のライブラリ?) の独自仕様で, ISO C なら %lc とか %ls とかするところ %wc とか %ws とできるようになっているのではないかと思います. ひょっとすると, %lc とか %ls は使えないのかも... まあ, %wd とかやってることから推測すると, もしかすると %ld としたかったのかなぁとか思います.

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

> 「w」ってどのような時につかうものでしょうか? 普通は使わない。 > また、このような書き方は有効なのでしょうか? 言語標準(ISO/IEC9899)に規定はないので、 Linuxでの挙動は仕様通りの正しい動作です。 # Solarisの独自拡張仕様は知らない。manとかで出てきませんか?

ari_els
質問者

お礼

すいません。 補足の追加です。 %ws の場合、精度を画面表示の最大カラム数として解釈します。精度は、最初にピリオドが来て、その後に 10 進数の文字列が続く形式になります。NULL の 10 進数の文字列 は 0 として扱われます。精度で指定したパディングは、フィールド幅で指定したパディングより優先されます。 ということも書かれています。(これも意味がよく分かりません。)

ari_els
質問者

補足

回答ありがとうございます。 >普通は使わない。 ★そう思っていますが、普通じゃないときってどんなときなんでしょ。 manでは wc 整数 args はワイド文字 ( wchar_t )に変換さ れて出力されます。 ws args はワイド文字の文字列とみなされ ( ワイド文字ポインタ ) 、その文字列のワイド文字が最後の NULL 文字まで書き込まれます(NULL 文字は含まない ) 。精度を指定すると、精度によって指定された表示画面のカラム数に表示するワイド文字列部分だけを出力します。精度を指定しないと、無限を指定したことになり、最初の NULL 文字 までのすべてのワイド文字が出力されます。 argsに NULL を指定した場合、変換の結果は不定となります。 と言う感じに書かれてはいるのですが。。。すみません。意味がよく分かりません。(なので、ここで聴いています。) 因みに、wdというのは出てきませんでした。

専門家に質問してみよう