c ++中的C字符串比较问题

时间:2009-08-16 00:10:50

标签: c++ cstring

我在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”。我错过了一些明显的东西吗?

3 个答案:

答案 0 :(得分:18)

argv[1]char*,因此通过使用==进行测试,您将检查指针是否指向与您正在使用的各种字符串常量的开头相同的位置。 ......事实并非如此。要比较内容,请使用strcmp

答案 1 :(得分:5)

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

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

E.g。

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

变为

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

您可能必须包含string.h才能将strcmp原型放入代码中。

答案 2 :(得分: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]));
}