我正在努力学习C ++,并且通过实践来学习......
这段代码的最终结果是它将char* argv[2]
输出到一个只接受字符串作为输入的函数,它将输出一个更改的字符串。
如何将char* argv[2]
转换为字符串?
由于某种原因,我尝试的所有内容都会导致命令提示符崩溃。
int main(int argc, char* argv[])
{
std::string com2 = argv[2];
char* com1[4];
com1[1] = "-f";
com1[2] = "--file";
com1[3] = "-t";
com1[4] = "--text";
if (strcmp(argv[1], com1[1]) == 0) {
cout << com2;
}
}
答案 0 :(得分:6)
数组索引从0
运行到N - 1
,其中N
是数组中元素的数量。因此4
是无效索引,会导致未定义的行为。
在访问argc
中的元素之前,请先检查argv
的值,确保为该程序提供了正确数量的参数。
答案 1 :(得分:1)
com1[4]
无效,导致未定义的行为。 C和C ++中的数组是从0开始的,因此数组的有效索引为0,1,2,3
。
答案 2 :(得分:0)
C和C ++中的局部变量实际上总是自动的(除非声明为static
),这意味着它们被放置在堆栈中。堆栈向下增长,而数组在内存中向上增长。这两者的结合意味着通常在任何堆栈数组的最后一个元素之后存在重要的东西并且写入它是非常危险的(它总是很危险但是在堆栈数组的情况下它非常危险)。分配给com1[4]
写入超过com1
数组的末尾,可能会覆盖std::string
实例com2
的某些数据成员或者破坏main
的堆栈帧1}} function(取决于编译器如何将com1
和com2
放入堆栈中。)
如果你只用一个参数启动程序,那么argv
只有2个元素而argv[2]
会:
如果你在没有任何参数的情况下启动程序,那么argv
将只有1个元素,argv[1]
和argv[2]
都将超出边界访问权限并返回随机值。为了防止这些情况,您应该在程序的最开头添加以下内容:
if (argc < 3) {
cerr << "ERROR: Provide at least 2 arguments" << endl;
return 1;
}
请注意,argv
始终至少有一个元素(即argv[0]
始终是正确的引用) - 可执行文件的名称。因此argc
总是等于1
。