这段代码出了什么问题? (将char *转换为字符串)

时间:2012-11-21 19:42:06

标签: c++ string char

我正在努力学习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;
    }
}

3 个答案:

答案 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(取决于编译器如何将com1com2放入堆栈中。)

如果你只用一个参数启动程序,那么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