大文字・小文字の区別なしで文字列比較をするには?

解決


トマト  2009-08-25 21:56:35  No: 70818

strcasecmpを使用してlinuxではコンパイルを行い
これをVC++に移植した再にstrcasecmpが使用できないようだったので
strcasecmp->_tcsicmpに変更して再コンパイルを行ったところ

「wchar_t *に変換できませんでした」のエラーメッセージがあり
if(_tcsicmp((wchar_t *)L"aaa", argv[1]+1 == 0)
wchar_t *にキャストを行いコンパイルは通しましたが、

いざ、デバックをしてみると「アクセス違反をしました」となってしまい
動きません。
文字が比較できるようにするにはどうしたらいいのでしょうか?


Blue  2009-08-25 22:03:48  No: 70819

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)


トマト  2009-08-25 22:46:42  No: 70820

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])
---------------------------------------------------
のようになっていました。


Blue  2009-08-25 22:57:33  No: 70821

起動引数を渡していますか?

argc が 1 にもかかわらず、 argv[1] を見に行くもしくは
argc が 2 以上で、 argv[1][0] が '\0' にも関わらず、&argv[1][1](=argv[1]+1)を見に行く

ってことはないですよね?


トマト  2009-08-25 23:13:10  No: 70822

ユーザーが入力してきた文字をみて
実行したい処理のロジックに入っていくようにしていて

まずlinuxで使用していたときには
望みとおりの動きをしてくれていたのですが、
VC++ にコピー((char *)->(_TCHAR*)には変えましたが)したら
不適切なPtrになってしまっているのです。


トマト  2009-08-25 23:13:11  No: 70823

ユーザーが入力してきた文字をみて
実行したい処理のロジックに入っていくようにしていて

まずlinuxで使用していたときには
望みとおりの動きをしてくれていたのですが、
VC++ にコピー((char *)->(_TCHAR*)には変えましたが)したら
不適切なPtrになってしまっているのです。


Blue  2009-08-25 23:18:15  No: 70824

>VC++ にコピー((char *)->(_TCHAR*)には変えましたが)
とは?具体的にどのようなことでしょうか?


トマト  2009-08-25 23:18:42  No: 70825

ビルドを行うと
1>LINK : 前回のインクリメンタル リンクで C:\Documents and \My Documents\Visual Studio 2008\Projects\test\Debug\test.exe が見つからなかったか、ビルドされませんでした。フル リンクを行います。

と、表示されるのですが何か関係ありますか?


トマト  2009-08-25 23:27:08  No: 70826

>>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;に変更


Blue  2009-08-25 23:35:49  No: 70827

Visual Studioはデバッグ実行ができますので、_tcsicmpのところに
ブレイクポイントを置いて、argvを確認してみてはどうでしょうか?

また、文字セットをマルチバイト文字セットに変えた時は正常に動くか確認してみてください。


トマト  2009-08-25 23:56:07  No: 70828

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  って使い方しないのでしょうか?

マルチバイト文字って何なのか使い方の分からないので調べてみます。


Blue  2009-08-26 00:14:38  No: 70829

if (argc < 2) 
{
    printf("引数が足りん\n");
    return -1;
}

TCHAR* cmd = argv[1];
if (_T('-') == *cmd)
{
    if (_tcsicmp(_T("aaa"), cmd + 1) == 0)
    {
    }
}


トマト  2009-08-26 01:31:03  No: 70830

if (argc < 2) 
{
    printf("引数が足りん\n");
    return -1;(<-入れ忘れていました)
}
それと、デバックを行っていた際に
プロジェクトのプロパティの中にある引数指定を設定しないまま
デバックしていたのもあって
今までlinuxでデバックしていたときには
[  ]./test -aaa [Enter]
で表示させていたのもあってWinでも同じようにするんだと
思っていたのも大きな勘違いでした。
対応して頂いて本当にありがとうございました!


トマト  2009-08-26 01:32:48  No: 70831

無事解決させて頂けました。
本当にありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加