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]是 a char*,因此通过测试==您正在检查指针是否指向与您正在使用的各种字符串常量的开头相同的位置......这不会是这种情况。要改为比较内容,请使用strcmp

于 2009-08-16T00:13:14.380 回答
5

问题是,您的代码比较的是指向字符串的指针,而不是字符串本身。

您必须将比较替换为对字符串比较函数的调用。

例如

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

变成

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

您可能必须包含 string.h 才能将 strcmp 原型添加到您的代码中。

于 2009-08-16T00:15:29.390 回答
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 回答