No.2ベストアンサー
- 回答日時:
>wcsrchr((const unsigned TCHAR*)buf,(unsigned int)c;に変えたのですが、「型名が使用できません」のエラーがでます。
wcsrchrの第一引数の型がunsignedでないので当然です。
ひょっとして前は相当古いコンパイラを使っていなかったでしょうか?(VC6等)
型チェックが厳密でないコンパイラだと通っていたかもしれません。
仮にUNICODEでないとしても
正しくキャストしないとコンパイルエラーになります。
例えばstrrchr( (const unsigned char*)buf , (unsigned int)c );
これはvc2010でエラーになります。UNICODEかどうかとは別問題です。
さらにいえば
wcsrchrはwchar_t専用の関数です。
TCHAR用には_tcsrchrが用意されておりこちらを使うべきです。
http://msdn.microsoft.com/ja-jp/library/ftw0heb9 …
>wcsrchr((const TCHAR*)buf,(unsigned int)c;にするとコンパイルは通るのですが、元のconst unsigned char*
>から意味が変わっているように思えて困っております。
このケースでいえばunsignedを外すキャストしているだけなので、関数内部での動作は影響しません。
No.3
- 回答日時:
TCHAR がどのように定義されているのかは知りませんが, typedef を使っているのであれば
const unsigned TCHAR*
は正しくありません. 「型名が使用できません」というエラーはこのことを言っていると思われます.
TCHAR に相当する unsigned バージョンが用意されていればそれを使って終わりなんだけど, そうでないと難しいなぁ.
No.1
- 回答日時:
まずTCHARとはなんなのかを意識する必要があります
UNICODEがdefineされていれば
wchar_tとなり、そうでなければcharに置き換わります。
>const unsigned char*
>はどのように書き換えればよいのでしょうか?
const unsigned char* が何を期待しているかに依ります。
例えばUNICODE環境でconst unsigned wchar_t*を期待しているのであればconst unsigned TCHAR*となります。
※LPCTSTRはconst TCHAR*なので符号比較をしている箇所があれば意味が変わります。
ただUNICODEがdefineされている環境以外でコンパイルする事がないのなら
TCHARでなくwchar_tをそのまま使っても良いかと思います(実際現在のDirectX_SDKのサンプルコードではTCHARは使わずwchar_tを指定しています)
またユニコードでもUTF8で文字列を扱っている箇所は通常charを使うので使い分けが必要なケースもあります。
※wchar_tは環境依存なので気をつける必要があります。sizeof(wchar_t)はWin+VC2010なら2かもしれませんが
solaris+gcc4なら4だったりします(たしかコンパイラで指定可能)。
これはwinの場合文字コードがUTF16を期待しているのに対して
solarisはUTF32(UCS4)を期待しているからです。
この回答への補足
お返事ありがとうございます。
頂いたアドバイスを元に
_mbsrchr(const unsigned char*)buf,(unsigned int)c;
をUNICODE化のため、
_mbsrchr((const unsigned TCHAR*)buf,(unsigned int)c;
とすると、「型名が使用できません」のエラーがでますので、
wcsrchr((const unsigned TCHAR*)buf,(unsigned int)c;
に変えたのですが、「型名が使用できません」のエラーがでます。
wcsrchr((const TCHAR*)buf,(unsigned int)c;
にするとコンパイルは通るのですが、元の
const unsigned char*
から意味が変わっているように思えて困っております。
大変お手数ですが補足頂ければと思いますので
何卒よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# Cの関数の引数のconst *charについて 5 2023/04/25 13:05
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
C言語 スタック pop-up
-
干支のプログラム
-
C言語のfor文です。 繰り返しの...
-
スタックポインタを使って,1...
-
atoi( ) の反対をやりたい
-
C言語について
-
charからLPTSTRへの変換方法
-
switch文で文字を比較すること...
-
for文 アスタリスクで形を作る
-
c++ 文字列を入力して、一文字...
-
CStringをwchar_tに変換したい
-
8進数と16進数で表示するプロ...
-
C言語の入力した文字を反転させ...
-
double型の値をchar配列に変換...
-
コンパイルエラー invalid ope...
-
const char** p;のとき、free(p...
-
MFCでのBITMAP作成について
-
間接操作のレベルとは
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
c++ 文字列を入力して、一文字...
-
CStringをwchar_tに変換したい
-
switch文で文字を比較すること...
-
干支のプログラム
-
絶対パスからのファイル名の切...
-
3桁区切(コンマ)記号をつけ...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
【C言語】文字型と整数型の違い
おすすめ情報