2

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

3 回答 3

6

数组索引从0N - 1,其中N是数组中元素的数量。因此4是一个无效的索引,并导致未定义的行为。

argc在访问argv.

于 2012-11-21T19:45:00.553 回答
1

com1[4]无效,并导致未定义的行为。C 和 C++ 中的数组是从 0 开始的,因此数组的有效索引是0,1,2,3.

于 2012-11-21T19:44:15.687 回答
0

C 和 C++ 中的局部变量实际上总是自动的(除非声明static),这意味着它们被放置在堆栈上。堆栈向下增长,而数组在内存中向上增长。这两者的结合意味着通常在任何堆栈数组的最后一个元素之后有一些重要的东西并且写过去是非常危险的(它总是很危险,但在堆栈数组的情况下它是非常危险的)。分配给超出数组com1[4]末尾的写入,可能会覆盖实例com1的某些数据成员或破坏函数的堆栈帧(取决于编译器如何放入堆栈)。std::stringcom2maincom1com2

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

于 2012-11-21T20:04:24.600 回答