2009-08-16 34 views
0

我一直在我的c + +程序中比较麻烦。这是煮熟的版本。在c + +中的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”而不是“去”。我错过了明显的东西吗?

+0

是的,你是.... – Tom 2009-08-16 00:35:23

回答

18

argv[1]char*,所以用==测试你检查,如果指针指向同一个地方,你正在使用的各种常量字符串的开始......这不会是这种情况。若要比较内容,请使用strcmp

+3

或者,如果你想要的参数是stricmp不区分大小写 – 2009-08-16 00:16:16

+1

或者strncmp如果你只想测试前n个字符。 – 2009-08-16 00:18:46

+2

'stricmp()'不是标准的。 Chere没有真正的标准C(或C++,据我所知 - 请问一个真正的C++程序员)做一个不区分大小写的字符串比较的方法。 GCC提供了strcasecmp,VC++提供了stricmp ... – 2009-08-16 00:20:03

5

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

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

E.g.

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

成为

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

您可能必须包含string.h中得到的strcmp原型到您的代码。

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])); 
} 
+0

好主意。但是,不应该在数组边界之外访问数组,但结果是未定义的,尽管只要数组不在一页内存的末尾,它就会工作。尝试parameter_list(&argv [0] + 1,&argv [0] + argc) – iain 2009-08-16 13:38:55

+0

构造函数绝不会在其范围外引用'argv'。这是一个STL开放范围,因此它从'argv [1]'开始复制,并在'argv [argc]'之前的元素结束。请记住,'end()'是STL实际上是_“容器的最终值”_。如果容器是一个数组,那么这是数组最后一个元素之后的元素。然而,'argv [argc]'(计算的)地址溢出地址范围的可能性很小,但我认为标准实际上也提供了对这种情况的保护。 – 2009-08-20 21:27:10