C++中argv指针与字符串、int类型比较结果不符合预期求解
错误原因分析
- 原代码
if (argv[1] == "w")的问题:
C/C++中,C风格字符串(char*/const char*类型)直接用==比较时,比较的是两个指针指向的内存地址,而非字符串本身的内容。argv[1]是指向命令行参数存储区域的指针,"w"是存储在常量区的字符串字面量,二者的内存地址完全不同,所以条件永远为假。 - 写法
if(&argv[1] == "w")的问题:&argv[1]是取argv数组中第2个元素的自身地址,类型为char**,和"w"退化成的const char*指针类型都不匹配,比较的是两个完全无关的内存地址,不可能成立。 - 写法
if(argv[1]=='w')的问题:'w'是char类型的字符常量,本质是值为119的整数,这里相当于把argv[1]存储的内存地址和整数119做比较,二者逻辑完全不相关,条件永远为假。
正确实现方式
两种常见的实现方案:
- C风格方案:使用
<cstring>头文件中的strcmp函数比较字符串内容,函数返回0时代表两个字符串内容完全相等。
完整修改示例:#include <iostream> #include <cstring> using namespace std; int main(int argc, char** argv) { // 先判断参数数量,避免无参数时访问越界 if (argc >= 2 && strcmp(argv[1], "w") == 0) { cout << "this was worked"; } else { cout << "this did not worked"; } return 0; } - C++风格方案:将
argv[1]转换为std::string类型,直接用==运算符即可比较字符串内容,语法更直观。
完整修改示例:#include <iostream> #include <string> using namespace std; int main(int argc, char** argv) { if (argc >= 2 && string(argv[1]) == "w") { cout << "this was worked"; } else { cout << "this did not worked"; } return 0; }
内容的提问来源于stack exchange,提问作者Chintu sharma
相关产品推荐
相关产品推荐

