C++ strcpy 函数在少数主要情况下失败

C++ strcpy function fails in few major cases

本文关键字:情况下 失败 strcpy 函数 C++      更新时间:2023-10-16

当执行交换两个字符串的代码时,我得到不需要的输出

#include<bits/stdc++.h>
using namespace std;
int main()
{
char a2[] = "Hello world";
char a1[] = "Geek";
char a3[20];
cout<<a2<<endl<<a1<<endl;
strcpy(a3,a1);
strcpy(a1,a2);
strcpy(a2,a3);
cout<<a2<<endl<<a1<<endl;
}

我得到这些结果:

Hello world
Geek
Geek
HelloGeek (I expect it to be HelloWorld)

我在代码中做错了什么。

在你的程序中

char a2[] = "Hello world";

定义一个字符数组,其大小适合字符串文字"Hello world"。它可以包含 12 个字符,包括 NUL 终止符。

char a1[] = "Geek";

行为相同,但"Geek"只需要 5 个字符的 nul,因此数组的长度为 5 个字符。

strcpy(a3,a1);

按照您的期望,将 4 个字符的"Geek"复制到a3的 20 字节缓冲区中,NUL 终止。

strcpy(a1,a2);

尝试将"Hello world"放入a1的五个字符数组中。这会在缓冲区溢出时调用未定义的行为。未定义的行为听起来就像是这样,发生了一些未定义的事情,所以从现在开始你不能依赖你对这个程序的任何期望。可能发生的情况是周围的其他变量之一a1部分覆盖,但如果编译器生成一个程序,使您的计算机跳起来并开始跳舞Macarena,那么编译器将同样正确。

详细阐述Paul Mc Kenzie的评论:

字符串的内存已在程序堆栈上静态分配。 例如,包含"Geek"的数组只有空间和终止的空字符,因此您不应该在那里复制较长的字符串。

我建议你改用std::string。它会自动处理缓冲区分配,您可以使用 = 而不是 strcpy。