C++ strcpy 函数在少数主要情况下失败
C++ strcpy function fails in few major cases
当执行交换两个字符串的代码时,我得到不需要的输出
#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。
相关文章:
- C++ strcpy 函数在少数主要情况下失败
- 在特定情况下失败
- 在儿童的特定情况下,向下渗透MIN二进制堆失败
- 在这种情况下,插入 std::map 可能会失败?
- 为什么我的代码在没有 chroot 函数的情况下工作,但使用 chroot 函数失败?
- 调试断言仅在某些情况下失败?C++
- “overload_cast”在特定情况下失败
- 在这种情况下,SetContextProperty()如何失败
- 解决方案重新生成在 30% 的情况下失败
- 在某些情况下,通配符模式匹配失败
- inotify_add_watch在没有此类文件或目录的情况下失败
- C 标准是否指定在某些情况下,编译应在错误中失败
- 在某些情况下,我的快速排序实现失败
- 在 boost::lockfree:queue 默认构造函数的情况下断言失败
- 为什么在这种情况下c++模板参数推导失败
- 尝试在 QLabel 上绘画失败(无法在没有对象的情况下调用成员函数"虚拟无效 QLabel::p aintEvent(QPaintEvent*)")
- 运行时检查失败 #3 - 变量"result"在未初始化的情况下被使用
- 'new'语句是否可以在不引发异常的情况下失败?
- 为什么程序在没有尝试/捕获的情况下失败
- 复制构造函数在相同的情况下失败或成功