strcasecmpを使用してlinuxではコンパイルを行い
これをVC++に移植した再にstrcasecmpが使用できないようだったので
strcasecmp->_tcsicmpに変更して再コンパイルを行ったところ
「wchar_t *に変換できませんでした」のエラーメッセージがあり
if(_tcsicmp((wchar_t *)L"aaa", argv[1]+1 == 0)
wchar_t *にキャストを行いコンパイルは通しましたが、
いざ、デバックをしてみると「アクセス違反をしました」となってしまい
動きません。
文字が比較できるようにするにはどうしたらいいのでしょうか?
main文は char argv[] となっているのでしょうか?
でしたら_tcsicmpではなくstricmpを使ってください。
if (stricmp("aaa", argv[1] + 1) == 0)
もしくは_tcsicmpを使うならば、_tmainを使ってください。
int _tmain(int argc, TCHAR* argv[])
if (_tcsicmp(L"aaa", argv[1] + 1) == 0)
main文は以下のようにしています
int _tmain(int argc, _TCHAR* argv[])
if(_tcsicmp(L"show", (argv[1]+1)) == 0)
のようにしてみたら以前のような(wchar_t *)はなくても出来るようになったのではずしてしまいましたがいけなかったでしょうか?
でも、相変わらず「読込み中にアクセス違反をしました」で実行出来ない状態です。
---------------------------------------------------
[自動変換]には以下のようになってました
argv
->\Visual Studio 2008\Projects\test\Debug\test.exe
->99L'c'
argv[1] 0X00000000 <不適切なPtr>
cmd 0X00000000 <不適切なPtr> (<-cmd = argv[1])
---------------------------------------------------
のようになっていました。
起動引数を渡していますか?
argc が 1 にもかかわらず、 argv[1] を見に行くもしくは
argc が 2 以上で、 argv[1][0] が '\0' にも関わらず、&argv[1][1](=argv[1]+1)を見に行く
ってことはないですよね?
ユーザーが入力してきた文字をみて
実行したい処理のロジックに入っていくようにしていて
まずlinuxで使用していたときには
望みとおりの動きをしてくれていたのですが、
VC++ にコピー((char *)->(_TCHAR*)には変えましたが)したら
不適切なPtrになってしまっているのです。
ユーザーが入力してきた文字をみて
実行したい処理のロジックに入っていくようにしていて
まずlinuxで使用していたときには
望みとおりの動きをしてくれていたのですが、
VC++ にコピー((char *)->(_TCHAR*)には変えましたが)したら
不適切なPtrになってしまっているのです。
>VC++ にコピー((char *)->(_TCHAR*)には変えましたが)
とは?具体的にどのようなことでしょうか?
ビルドを行うと
1>LINK : 前回のインクリメンタル リンクで C:\Documents and \My Documents\Visual Studio 2008\Projects\test\Debug\test.exe が見つからなかったか、ビルドされませんでした。フル リンクを行います。
と、表示されるのですが何か関係ありますか?
>>VC++ にコピー((char *)->(_TCHAR*)には変えましたが)
>とは?具体的にどのようなことでしょうか?
----------------------------------------------------------
int main(int argc, char* argv[])linuxではだった所
->int _tmain(int argc, _TCHAR* argv[])に変更
int test(int argc, _TCHAR* argv[])->_TCHAR*は char*だった
変数もchar* cmd-> _TCHAR* cmd;に変更
Visual Studioはデバッグ実行ができますので、_tcsicmpのところに
ブレイクポイントを置いて、argvを確認してみてはどうでしょうか?
また、文字セットをマルチバイト文字セットに変えた時は正常に動くか確認してみてください。
cmd = argv[1];
if('-' == *cmd)
{
if(_tcsicmp(L"aaa", argv[1]+1) == 0)
{
//version infomation
printf("Hello World\n");
return 0;
}
というところの
if('-' == *cmd)<-ココでエラーが起きていました
何も値が入っていないという
_TCHAR* cmd;なのですが
*cmd って使い方しないのでしょうか?
マルチバイト文字って何なのか使い方の分からないので調べてみます。
if (argc < 2)
{
printf("引数が足りん\n");
return -1;
}
TCHAR* cmd = argv[1];
if (_T('-') == *cmd)
{
if (_tcsicmp(_T("aaa"), cmd + 1) == 0)
{
}
}
if (argc < 2)
{
printf("引数が足りん\n");
return -1;(<-入れ忘れていました)
}
それと、デバックを行っていた際に
プロジェクトのプロパティの中にある引数指定を設定しないまま
デバックしていたのもあって
今までlinuxでデバックしていたときには
[ ]./test -aaa [Enter]
で表示させていたのもあってWinでも同じようにするんだと
思っていたのも大きな勘違いでした。
対応して頂いて本当にありがとうございました!
無事解決させて頂けました。
本当にありがとうございました