c - 如何连接两个字符串并保存在C中的第三个变量中?
问题描述
我已经定义了一个char
带有预定义 HTTP post 字符串的数组,如下所示:
char header[] = "POST /api/add HTTP/1.1\r\nHost: xxxxxxx:3000\r\nContent-Type: application/octet-stream; charset=utf-8\r\nContent-Length: 500\r\nName: ";
strcat(header, strDevicename); \\
strcat(header, "\r\n\r\n");
其中strDevicename
是一个char
变量名,每次请求都会改变。问题是当我第一次运行它时,它正在工作,但之后Name
被a96ed5ÿÿa96ed58e8355
.
在 HTTP post 标头中使用 C 语言添加两个字符串和一个实时更改变量的最佳方法是什么?
解决方案
在您的代码中,数组header
的大小由提供的初始化字符串的大小决定,并且它没有任何额外的空间来存储(或附加)任何其他字符。
引用C11
,第 6.7.9 章
如果初始化未知大小的数组,则其大小由具有显式初始化程序的最大索引元素确定。数组类型在其初始值设定项列表的末尾完成。
接下来,对于strcat()
,来自第 §7.24.3.1 章
该
strcat
函数将 所指向的字符串的副本s2
(包括终止空字符)附加到 所指向的字符串的末尾s1
。[...]
这表明,目标s1
(此处为header
)应该有足够的存储空间来保存连接的字符串。
因此,当您运行过去分配的内存时,尝试将strcat()
withheader
作为源代码会在此处调用未定义的行为。
在用初始化字符串填充后,您需要header
留出足够的空间。为数组使用固定大小,在用初始化字符串填充它后,它有很多多余的东西,比如
#define STRSIZ 512
char header[STRSIZ] = "POST /api/add HTT.........
推荐阅读
- featherlight.js - 导入featherlightGallery的问题
- java - 正确使用 BitSet 替换基于 int 的标志。是否可以?
- three.js - ThreeJS:有没有可能减少三角形数量的方法
- javascript - Intl.DateTimeFormat 显示时间为 24:59
- python - 有没有办法在 dashTable 中返回当前页面?
- php - 在页面加载时提交 $_POST 变量而不刷新
- content-management-system - 如何在 Plone-4 中限制匿名用户访问内容?
- docker - 如何解决 Rider docker 调试问题
- elasticsearch - 带有 ELB 的弹性搜索 AWS EC2 中的 discovery.seed_hosts
- android - 存储字符串的共享首选项仅返回其中的一部分