C++ 等于在c+中返回false+;
我是cpp的新手,我正在尝试做一个项目。它表示代码必须接受文件名作为参数,并将由以下人员运行: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
./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;
}