【问题标题】:Garbage value getting printed when using copy function for a string in c++在 c++ 中对字符串使用复制功能时打印垃圾值
【发布时间】:2020-05-17 05:27:28
【问题描述】:

我只是在 c++ 中使用复制函数将字符串复制到数组中。但以下代码显示的结果包含垃圾值:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    char t[10];

    s = "Hello";
    s.copy(t, s.length());
    cout << t;

    return 0;
}

输出:Hellov._Sï

然而,如果我以不同的方式做同样的事情。我得到了正确的输出。

#include <iostream>
#include <string>
using namespace std;

    int main()
    {
        string s = "Hello";
        char t[10];

        s.copy(t, s.length());
        cout << t;

        return 0;
    }

输出:你好

有人可以解释为什么会这样吗?我对 c++ 比较陌生。

【问题讨论】:

  • 这能回答你的问题吗? What is a null-terminated string?
  • 我只是在 c++ 中使用 copy 函数将字符串复制到数组中 -- 你知道这不是必需的,你可以使用std::string 原样,不复制任何内容?
  • @Yksisarvinen 我不太明白它与我的问题有什么关系。我的代码中字符串对象的初始化有问题吗?
  • @PaulMcKenzie 我知道这一点,但我只是想知道 str.copy() 是如何工作的。
  • @ChinmayVemuri copy 做了它应该做的事。 s.length() 复制到 t 的字符数。它不会做更多或更少。复制完成后,copy 不知道如何处理t。简而言之,您的数组具有未初始化的值,因为它是一个局部变量,与本地声明的任何其他未初始化的变量类型没有什么不同。

标签: c++ string class copy


【解决方案1】:

问题在于std::string::length() 不包含字符串的 NUL 终止符。所以s.copy(t, s.length());'H', 'e', 'l', 'l', 'o' 复制到t,但不是下面的'\0'。该数组的以下元素未归零(它们可能偶然包含一些零)。

但是std::cout,在传递char* 时,需要一个以空字符结尾的字符串。它将继续打印,直到找到 0 字节或发生其他情况(溢出 t 是未定义的行为)。

您可以通过 nul 终止 t 来“修复”它:

t[s.length()] = '\0';

【讨论】:

  • C++ 有一种叫做“未定义行为”的东西。您很幸运,空值位于正确的位置。为确保定义行为,必须将 null 放在那里。
  • @anastaciu 不幸的是,在 C++ 中获得的预期输出不足以说明您的程序有效。
  • @anastaciu,自 C++11 以来,string 将被空终止,是的,但是 s.length() 确实 not\0 包含在其计数中,所以副本仍然无法正常工作。
  • @anastaciu 对字符串文字的赋值与此处无关,只是碰巧未初始化的字符数组 t 在该位置有 0 个字节。 s.length()不包括\0所以std::string::copy()不管它是否存在都不会复制它。
  • @anastaciu -- 如果程序员要求复制 5 个字节,那么他们只想要复制 5 个字节,而不是 6 个。让std::copy 做程序员没有要求的额外工作反对 C++ 只得到你所支付的东西的哲学。
猜你喜欢
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多