【问题标题】:What's wrong with this code? (Converting char* to string)这段代码有什么问题? (将 char* 转换为字符串)
【发布时间】:2012-11-21 19:42:05
【问题描述】:

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

【问题讨论】:

    标签: c++ string char


    【解决方案1】:

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

    在访问argv 中的元素之前,通过检查argc 的值,确保向程序提供了正确数量的参数。

    【讨论】:

    • @AcronymTheRapper - 如果 hmjd 写了正确的答案,请将他的答案标记为“正确的”。
    • 它说我必须等待 2 分钟才能做到这一点。我可能是 SackOverflow 的新手,但我并不那么愚蠢。大声笑
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-10-08
        • 2022-12-17
        • 2013-02-15
        • 2021-02-23
        • 2015-04-25
        • 2018-09-09
        相关资源
        最近更新 更多