Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 等于在c+中返回false+;_C++_G++_Command Line Arguments - Fatal编程技术网

C++ 等于在c+中返回false+;

C++ 等于在c+中返回false+;,c++,g++,command-line-arguments,C++,G++,Command Line Arguments,我是cpp的新手,我正在尝试做一个项目。它表示代码必须接受文件名作为参数,并将由以下人员运行: ./main -i filename 我已经编写了一个for循环,它将遍历参数列表以查找“-I”参数,以便确定文件名。但这一行总是返回false: argv[i] == "-i" 下面是我的代码: #include <string> #include <iostream> int main(int argc, char *argv[]) { std::string

我是cpp的新手,我正在尝试做一个项目。它表示代码必须接受文件名作为参数,并将由以下人员运行:

./main -i filename
我已经编写了一个for循环,它将遍历参数列表以查找“-I”参数,以便确定文件名。但这一行总是返回false:

argv[i] == "-i"
下面是我的代码:

#include <string>
#include <iostream>

int main(int argc, char *argv[]) {
    std::string test = argv[0];
    for(int i = 0; i < argc; i++){
        if(argv[i] == "-i"){
            test = argv[i+1];
            break;
        }
    }
    std::cout << test;
    return 1;
}
#包括
#包括
int main(int argc,char*argv[]){
std::string test=argv[0];
对于(int i=0;ichar*
const char*

换句话说,将比较几乎不可能指向同一位置的两个指针,而不是比较
argv[i]
“-i”
。因此,检查在您的情况下不起作用

您可以通过多种方式修复它,例如将
“-i”
包装到
std::string
中,以使比较正常工作:

const auto arg = std::string{ "-i" };

for(int i = 0; i < argc; i++){
    if(argv[i] == arg){
        test = argv[i+1];
        break;
    }
}

这是一种更好的方法,因为它可以避免创建
std::string

您不能使用
==
将指向
char
的指针与字符串文本(
char const*
)进行比较。请使用
std::strcmp()
)或构造
std::string
)使用
==

尝试以下操作,使其与
字符*
相比较:

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
    string test;
    for(int i = 0; i < argc; i++){        
        cout << "\n" << argv[i] << endl;
        if((string)argv[i] == "-i"){
            test = argv[i + 1];
            cout << "test= " << test << endl;
            break;
        }
    }
    cout << test << endl;
    system("pause");
    return 0;
}
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[]){
串试验;
对于(inti=0;i如果在
-i
之后调用代码时没有文件名,您真的应该指出越界错误吗?最好的方法可能是针对
argc-1
进行测试。最好从索引1开始,因为程序名使用0。
它比较两个指针,因此结果总是错误的。
:不正确。指针比较是定义良好的。指向同一地址的指针之间的比较是一种合理的操作,这是很常见的。比较
char*
literal和
argv
的成员之间相等的几率几乎为零,但从技术上讲仍然是合法的结果。这有点吹毛求疵,但这是错误的所以
”\_(ツ)_/“
@Cyclic3这不是吹毛求疵,完全正确:)但对我来说,有时不清楚答案应该有多详细。可能,我需要编辑答案并提供更详细的解释。如果您使用的是C++17,为什么不使用字符串文字而不是声明完全不必要的常量?
If(argv[I]=“-I”sv)…
。对于超出范围的
i
最简单的修复方法是使用
i
作为限制器使用
std::string_view
(C++17)。请注意
argv[argc]
被标准定义为始终有效且为空,因此,如果代码定义得很好,它可能不是您所期望的。@JonathanCallen我将引用这句话作为事实。我知道您正在编写自己的解析器以供学习。一旦您知道如何做并了解实现它的路径,请查看此处。使用函数strcmp而不是“argv[i]==”-i“”,这是比较C中两个字符串的方式,而在代码中,“==”的两侧都会衰减为指针。为了得到一个好的答案,请解释您所做的更改以及为什么它会解决Q。除了其他人已经说过的之外,还不清楚这有什么。我还(a)不建议C样式转换&(B)仔细看看你在哪里索引到
argv[i+1]
。如果
-i
是最后一个参数,你会发生什么&你没有费心检查它后面是否有一个参数可以索引到?没什么好的-只是未定义的行为(例如,如果OP幸运,会崩溃,程序中毒)。编辑:好,
const std::string_view sv{ "-i" };

for(int i = 0; i < argc; i++){
    if(argv[i] == sv){
        test = argv[i+1];
        break;
    }
}
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
    string test;
    for(int i = 0; i < argc; i++){        
        cout << "\n" << argv[i] << endl;
        if((string)argv[i] == "-i"){
            test = argv[i + 1];
            cout << "test= " << test << endl;
            break;
        }
    }
    cout << test << endl;
    system("pause");
    return 0;
}