2){cout,c++,cstring,C++,Cstring" /> 2){cout,c++,cstring,C++,Cstring" />

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; } #包括“stdafx.h” #包括 #包括 使用名称空间std; int main(int argc,char*argv[]) { 如果(argc>2){cout

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; } #包括“stdafx.h” #包括 #包括 使用名称空间std; int main(int argc,char*argv[]) { 如果(argc>2){cout,c++,cstring,C++,Cstring,argv[1]是一个字符*,因此通过使用=进行测试,您正在检查指针是否指向与您正在使用的各种字符串常量开头相同的位置…情况并非如此。要比较内容,请使用。问题是,您的代码将指针与字符串进行比较,而不是与stings itsel进行比较f 必须用对字符串比较函数的调用替换比较 例如 if(argv[1]==“/1”){cout另一个选项是将C样式的参数转换为更友好的字符串向量,并对其进行处理: #include <string> #include <vector> type

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

问题是,您的代码将指针与字符串进行比较,而不是与stings itsel进行比较f

必须用对字符串比较函数的调用替换比较

例如


if(argv[1]==“/1”){cout另一个选项是将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]));
}
#包括
#包括
typedef std::向量参数_列表;
int
cpp_main(标准::字符串常量和程序名、参数列表常量和参数){
对于(参数列表::常量迭代器arg=params.begin();arg!=params.end();++arg){
如果(*arg==“/隐藏图标”){
}else if(*arg==“/显示图标”){
}否则如果(*arg==“/重新安装”){
将_设置为_默认值();
}如果(*arg==“/?”),则为else{
显示帮助(程序名称);
}否则如果(*arg==“/1”){
第一次跑步();
}否则{
显示帮助(程序名称);
}
}
返回0;
}
int
主(内部argc,字符**argv){
返回cpp_main(argv[0],参数_列表(&argv[1],&argv[argc]);
}

如果您想只对第一个n个字符进行测试,则如果您想使参数为不区分大小写或StrucMP,则<代码>严格限制()/代码>不是标准的。切尔的实际标准C(或C++,我可以说,请询问一个真正的C++程序员)。进行不区分大小写的字符串比较的方法。GCC提供stracecmp,VC++提供stricmp…很好,Stephen,当然他可能也想接受缩写(strncmp,strnicmp)和c。根据所需的标准遵从性级别,并非所有这些都可以通过
#include
(或C++-名称空间等效项)。strcasecmp是开放组/IEEE在其标准中指定的,请参阅。好主意。但是,您不应该访问超出其边界的数组,结果是未定义的,尽管通常只要数组不在内存页的末尾就可以工作。请尝试参数_列表(&argv[0]+1,&argv[0]+argc)构造函数从未在其范围外解除对
argv
的引用。这是一个STL打开范围,因此它复制从
argv[1]
开始,到
argv[argc]
之前的元素结束。请记住
end()
实际上是STL,它是“容器的结束值”。如果容器是一个数组,那么这是数组最后一个元素之后的元素。但是,
argv[argc]
(已计算)的地址溢出地址范围的可能性很小,但我认为标准实际上也提供了防止这种情况发生的保护。
if(strcmp(argv[1],"/1") == 0) {cout<<"go"<<endl;FirstRun();}
#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]));
}