【问题标题】:how to print char array in c++如何在 C++ 中打印字符数组
【发布时间】:2012-01-03 23:52:15
【问题描述】:

如何打印一个我初始化的 char 数组,然后连接到另一个 char 数组?请看下面的代码

int main () {
char dest[1020];
char source[7]="baby";
cout <<"source: " <<source <<endl;
cout <<"return value: "<<strcat(dest, source) <<endl;
cout << "pointer pass: "<<dest <<endl;
return 0;
}

这是输出

source: baby
return value: v����baby
pointer pass: v����baby

基本上我想看看输出打印

source: baby
return value: baby
pointer pass: baby

【问题讨论】:

  • 先尝试将dest 数组清零。 char dest[1020] = {0};

标签: c++ arrays pointers char


【解决方案1】:

你还没有初始化dest

char dest[1020] = ""; //should fix it

你很幸运,dest 中的第 6 个(随机)值是0。如果是第 1000 个字符,您的返回值会更长。如果它大于 1024,那么你会得到未定义的行为。

作为char 数组的字符串必须用0 分隔。否则没有人知道他们在哪里结束。您也可以通过将字符串显式设置为 0 来表示字符串在第零个字符处结束;

char dest[1020];
dest[0] = 0;

或者你可以用 0 初始化你的整个数组

char dest[1024] = {};

由于您的问题被标记为C++,我不得不指出,在 C++ 中,我们使用std::strings,这让您免于头疼。运算符 + 可用于连接两个std::strings

【讨论】:

  • 这是未定义的行为,句号。
  • 上面的 linuxuser27 所指出的初始化 char dest[1020] = "";char dest[1020] = {0}; 有什么区别
  • @James:从技术上讲,是的,但实际上,在我所知道的 所有 实现中,如果碰巧其中一个字符为零,那么没有比错误结果更糟糕的了发生。但无论如何,我同意无论如何都是UB
  • @user945511:char dest[1020] = {0}char dest[1020] = {}; 都将所有字符设置为 0。char dest[1020] = "" 只设置第一个。
  • @ArmenTsirunyan: char dest[1020]="" 也会根据刚刚出台的新标准将所有字符设置为 0,虽然在 2003 年的旧标准中没有明确说明。
【解决方案2】:

不要使用char[]。如果你写:

std::string dest;
std::string source( "baby" )
//  ...
dest += source;

,你不会有任何问题。 (其实你的问题是由于 strcat 需要以 '\0' 终止的字符串作为其第一个参数, 你给它随机数据。这是未定义的行为。)

【讨论】:

  • 你可以使用char[],但是你需要将问题标记为C,而不是C++;)
  • 我不能使用 std::string 因为我在处理字符
  • @user945511:嗯?您可以使用 [] 索引字符串,就像 char[]
  • @TristramGräbener 你也可以在 C++ 中使用char[]。它只会让你的生活变得更加艰难。我认为这是为专家保留的东西,在接近硬件代码的低级别工作。
  • @JamesKanze 这只是个玩笑。当然可以。在一些极其奇怪的情况下,它甚至可能会更好。
【解决方案3】:

您的 dest 数组未初始化。所以strcat 尝试将source 附加到dest 的末尾,这由一个尾随'\0' 字符确定,但未定义未初始化数组可能结束的位置......(如果它确实......)

所以你最终会打印或多或少的随机字符,直到意外出现'\0' 字符...

【讨论】:

    【解决方案4】:

    试试这个

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        char dest[1020];
        memset (dest, 0, sizeof(dest));
        char source[7] = "baby";
        cout << "Source: " << source << endl;
        cout << "return value: " << strcat_s(dest, source) << endl;
        cout << "pointer pass: " << dest << endl;
        getchar();
        return 0;
    }
    

    使用 VS 2010 Express。 声明 dest 后立即使用memset 清除内存,这样更安全。此外,如果您使用的是 VC++,请使用 strcat_s() 而不是 strcat()。

    【讨论】:

    • 使用memset 清除内存比使用= {}; 初始化更安全? oO
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2014-12-21
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多