0

C++ プログラムでの比較に問題があります。これは煮詰めたバージョンです。

#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char *argv[])
{
    if(argc>2){cout<<"3+Args"<<endl;}else//???
    if(argc==2){
        cout<<"2args"<<endl;
        if(argv[1]=="/hide-icons"){}
        if(argv[1]=="/show-icons"){}
        if(argv[1]=="/reinstall"){setAsDefault();}
        if(argv[1]=="/?"){showPossibleCommands();}
        if(argv[1]=="/1"){cout<<"go"<<endl;FirstRun();}
    }else{showPossibleCommands();cout<<argv[0]<<endl;}
    return 0;
}

"programname.exe /1" を実行すると、プログラムは "2args" を書き込みますが、"go" は書き込みません。明らかな何かが欠けていますか?

4

3 に答える 3

18

argv[1]は であるchar*ため、使用しているさまざまな文字列定数の開始点と同じ場所をポインターが指しているかどうかをテストする==ことで...これは当てはまりません。代わりにコンテンツを比較するには、 strcmpを使用します。

于 2009-08-16T00:13:14.380 に答える
5

問題は、コードが文字列自体ではなく、ポインターを文字列と比較することです。

比較を string-compare 関数の呼び出しに置き換える必要があります。

例えば

if(argv[1]=="/1"){cout<<"go"<<endl;FirstRun();}

になる

if(strcmp(argv[1],"/1") == 0) {cout<<"go"<<endl;FirstRun();}

strcmp プロトタイプをコードに組み込むには、string.h を含める必要がある場合があります。

于 2009-08-16T00:15:29.390 に答える
1

もう 1 つのオプションは、C スタイルの引数をより使いやすい文字列のベクトルに変換し、代わりに処理することです。

#include <string>
#include <vector>

typedef std::vector<std::string> parameter_list;

int
cpp_main(std::string const& program_name, parameter_list const& params) {
    for (parameter_list::const_iterator arg=params.begin(); arg!=params.end(); ++arg) {
        if (*arg == "/hide-icons") {
        } else if (*arg == "/show-icons") {
        } else if (*arg == "/reinstall") {
            set_as_default();
        } else if (*arg == "/?") {
            show_help(program_name);
        } else if (*arg == "/1") {
            first_run();
        } else {
            show_help(program_name);
        }
    }
    return 0;
}

int
main(int argc, char **argv) {
    return cpp_main(argv[0], parameter_list(&argv[1], &argv[argc]));
}
于 2009-08-16T00:39:04.537 に答える