LPCWSTR変数の扱いについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マカロニ
記事: 8
登録日時: 14年前

LPCWSTR変数の扱いについて

#1

投稿記事 by マカロニ » 14年前

LPCWSTR data = L"100,200";
のdataから
printf("%s",data);
とやったのですが、表示結果は先頭の「1」としか出ませんでした。
これは普通に文字列として使うことはできないのでしょうか?

またこのdata変数から100と200だけを取り出したいのですが
標準関数に指定の文字まで読み込む,というのが
なかったのですが良い方法はありますでしょうか。
環境はvisual studio 2010 C++になります。
よろしくお願いします。

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

Re: LPCWSTR変数の扱いについて

#2

投稿記事 by たかぎ » 14年前

マカロニ さんが書きました:LPCWSTR data = L"100,200";
のdataから
printf("%s",data);
とやったのですが、表示結果は先頭の「1」としか出ませんでした。
これは普通に文字列として使うことはできないのでしょうか?
書式指定と、それに対応する実引数の型が異なるために未定義の動作を引き起こしているのが原因です。
printf("%ls", data);
とすれば問題は解消します。
なお、文字列dataに日本語などが含まれる場合には、適切にロケールを設定してください。
マカロニ さんが書きました:またこのdata変数から100と200だけを取り出したいのですが
標準関数に指定の文字まで読み込む,というのが
なかったのですが良い方法はありますでしょうか。
環境はvisual studio 2010 C++になります。
よろしくお願いします。
100や200は文字列として取得するのでしょうか?
その場合、文字数は3文字に決まっているのでしょうか?
いずれにせよ、sscanfやswscanfで実現することができます。
具体的にはこんな感じです。

コード:

swscanf(data, L"%3[^,],%3[^\n]", s1, s2);
あるいは、wcscspnやwcschrなどで細かく制御してもよいでしょう。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: LPCWSTR変数の扱いについて

#3

投稿記事 by bitter_fox » 14年前

マカロニ さんが書きました:LPCWSTR data = L"100,200";
のdataから
printf("%s",data);
とやったのですが、表示結果は先頭の「1」としか出ませんでした。
これは普通に文字列として使うことはできないのでしょうか?

またこのdata変数から100と200だけを取り出したいのですが
標準関数に指定の文字まで読み込む,というのが
なかったのですが良い方法はありますでしょうか。
環境はvisual studio 2010 C++になります。
よろしくお願いします。
LPCWSTR型はWCHAR型のポインタ型で、WCHAR型はワイド文字を扱う型です。(ワイド文字は多くの場合ユニコードで表されます。)
仮にユニコードとすれば、このサイトを参考にすると、
0が0x0030
1が0x0031となります。

printf関数のフォーマット指示に%sを指定した場合は、\0が出てくるまで出力をしますので、もしこの文字列がリトルエンディアンで保存されていると
0x31003000・・・となり
実際に出力されるのは0x31だけであり、この0x31はASCII文字コードでも1を示しますので偶然にも1だけが出力されたことになります。
この問題を解決するにはフォーマット指示に%lsを指定してください。
http://www.trickpalace.net/cppll/reference/printf.htm

またその他の関数については、wchar.hに定義されている関数を使用してください。
http://www.c-tipsref.com/reference/wchar.html

[hr][修正]
マクロ->関数
一バイト文字でも->ASCII文字コードでも

マカロニ
記事: 8
登録日時: 14年前

Re: LPCWSTR変数の扱いについて

#4

投稿記事 by マカロニ » 14年前

たかぎさん、bitter_foxさんありがとうございました。
char型とはまた違った扱いで勉強になりました。
ヘッダーファイルを参照することも大切ですね
助かりました。

閉鎖

“C言語何でも質問掲示板” へ戻る