如何在C++中打印字符数组

7
如何打印一个字符数组,例如我初始化它然后将其连接到另一个字符数组?请参见下面的代码。
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

6
先将你的 dest 数组清零。char dest[1020] = {0}; - linuxuser27
4个回答

9

你还没有初始化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::string,这可以避免很多麻烦。操作符+可用于连接两个std::string


3
这是未定义行为,无疑。 - James Kanze
在Linuxuser27的指引下,初始化char dest[1020] = "";char dest[1020] = {0};有什么区别? - Carlitos Overflow
@James:从技术上讲,是的,但实际上,在我所知道的所有实现中,如果恰好其中一个字符为零,最糟糕的情况也只会出现错误的结果。但无论如何,我同意这仍然属于未定义行为。 - Armen Tsirunyan
@user945511:char dest [1020] = {0}char dest [1020] = {}都将所有字符设置为0。而char dest[1020] = ""仅设置第一个字符为0。 - Armen Tsirunyan
@ArmenTsirunyan: char dest[1020]="" 根据最新标准,也会将所有字符设置为0,尽管在2003年的旧标准中没有明确说明。 - fefe
访问未初始化的内存是未定义的行为,因为你无法知道其中的内容(而其中的某些内容可能会引起问题)。在这种情况下,如果内存至少在结尾前五个字符处包含 '\0',那么未定义行为的影响可能不会使程序崩溃,但这并不意味着它是有定义的。(你正在描述在遇到未定义行为时的典型行为。) - James Kanze

4

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

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

如果你的程序中加上了 '\0' 终止符,那么使用 strcat 函数将不会有问题。(事实上,你遇到的问题是由于 strcat 要求第一个参数为已经以 '\0' 结尾的字符串,而你传入的则是随机数据,这是未定义的行为。)


你可以使用char[],但是你需要将问题标记为C,而不是C++ ;) - Tristram Gräbener
我不能使用std::string,因为我正在处理字符。 - Carlitos Overflow
4
你可以像char[]一样使用[]来索引字符串。 - Armen Tsirunyan
@TristramGräbener 在C++中也可以使用char[]。但这会让你的生活变得更加困难。我认为这是专家们在接近硬件代码的低级别工作中所保留的东西。 - James Kanze
@JamesKanze 这只是一个玩笑。当然你可以这样做。在某些极端奇怪的情况下,这甚至可能更好。 - Tristram Gräbener

1

你的dest数组没有初始化。因此,strcat尝试将source附加到dest的末尾,由尾随的'\0'字符确定,但未初始化的数组可能在哪里结束是不确定的...(如果它真的结束了...)

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


0

试试这个

#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()。


1
使用 memset 清除内存比使用 = {}; 初始化更安全?oO - Armen Tsirunyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接