调用`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]

其中每个 XY 都是单个 char 对象(即通常每个内存字节)。

当您调用strcat(str1, str2) 时,您要求将5 个Ys 从str1 中的第一个\0 开始(直到str2 中的第一个\0,在这种情况下是最后一个一)。

所以第一个Y 进入str1 的第二部分,这很好:

str1 ---> [X, Y]
str2 ---> [Y, Y, Y, Y, Y]

但随后strcat 将继续在数组之外写入剩余的其他 4 个Ys,即它将“尝试”以下内容:

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`并能够将较大的字符串存储到较小的字符串中?的主要内容,如果未能解决你的问题,请参考以下文章

ABAP从较大内表取部分数据到较小内表中 怎么取 可以按字段直接取数吗?

绘制到较小的图像时,drawInRect 会失去分辨率吗?

并查集模板

POJ 1442 Black Box(优先队列)

加载较小分辨率的图像,直到完成下载较大分辨率的图像

使用 Arduino 解码较大的 DES 数据失败