调用`strcat`并能够将较大的字符串存储到较小的字符串中?
Posted
技术标签:
【中文标题】调用`strcat`并能够将较大的字符串存储到较小的字符串中?【英文标题】:Calling `strcat` and being able to store a larger size string into a smaller one? 【发布时间】:2018-12-16 20:08:31 【问题描述】:如何将所有大小为 5 的 str2
存储在大小仅为 2 的 str1
中?
我是在入侵系统吗?
教科书状态确保str1
必须有一个更大的值来存储str2
,但是为什么呢?
#include <iostream>
#include <cstring>
int main()
char str1[2] = 'B', '\0';
char str2[5] = 'c', 'o', 'l', 'l', '\0';
std::strcat(str1, str2);
std::cout << str1 << std::endl;
return 0;
【问题讨论】:
你有未定义的行为,就这么简单。 是的,你是。这两个变量在堆栈上,您正在覆盖 str2 的一部分。不要那样做,这就是string
的用途。
未定义行为是什么意思?
超出数组边界是未定义的行为。
教科书状态以确保str1必须有一个更大的值来存储s2 -- 教科书之所以这么说是因为如果它你将有一个损坏的程序不够大。
【参考方案1】:
所以你在堆栈中有这个:
str1 ---> [X, X]
str2 ---> [Y, Y, Y, Y, Y]
其中每个 X
和 Y
都是单个 char
对象(即通常每个内存字节)。
当您调用strcat(str1, str2)
时,您要求将5 个Y
s 从str1
中的第一个\0
开始(直到str2
中的第一个\0
,在这种情况下是最后一个一)。
所以第一个Y
进入str1
的第二部分,这很好:
str1 ---> [X, Y]
str2 ---> [Y, Y, Y, Y, Y]
但随后strcat
将继续在数组之外写入剩余的其他 4 个Y
s,即它将“尝试”以下内容:
str1 ---> [X, Y] Y, Y, Y, Y
str2 ---> [Y, Y, Y, Y, Y]
这是一个触发未定义行为的错误,这意味着您的程序存在错误(具体发生的情况取决于:它可能会崩溃、行为不端或可能只是靠运气运行)。
正如你的教科书所说,解决方案是让str1
足够大,至少可以容纳所有这些:
str1 ---> [X, Y, Y, Y, Y, Y]
str2 ---> [Y, Y, Y, Y, Y]
换句话说,str1
必须是一个至少包含 6 个元素的数组。
【讨论】:
以上是关于调用`strcat`并能够将较大的字符串存储到较小的字符串中?的主要内容,如果未能解决你的问题,请参考以下文章