c - 如何正确将 strcat 用于 char 数组?
问题描述
我正在尝试将另一个字符串连接到 arg[0]。
#include <stdio.h>
#include <string.h>
int main() {
char* arg[] = {
"Hello",
NULL,
NULL,
NULL
};
strcat(arg[0], " World");
}
这将返回中止陷阱。
我究竟做错了什么?
解决方案
您正在尝试使用以下内容重写字符串文字:
char* arg[] = { "Hello", ..... }; // "Hello" is a string literal, pointed to by "arg[0]".
strcat(arg[0], " World"); // Attempt to rewrite/modify a string literal.
这是不可能的。
字符串文字只能读取,不能写入。这就是使它们“字面意思”的原因。
如果你想知道为什么:
char* arg[] = { "Hello", ..... };
暗示"Hello"
作为字符串文字,您应该阅读该问题的答案:
顺便说一句,如果您这样做,甚至不可能(或至少在运行时出现分段错误):
#include <stdio.h>
#include <string.h>
int main() {
char a[] = "Hello"; // 6 for holding "Hello" (5) + "\0" (1).
strcat(a, " World");
}
因为数组a
需要有 12 个字符来连接两个字符串并使用strcat(a, " World");
- "Hello"
(5 个字符) + " World"
(6 个字符) + \0
(1 个字符),但它只有 6 个字符来保存"Hello"
+ \0
。使用时不会自动将内存空间添加到数组中strcat()
。
如果您使用这些语句执行程序,则您正在编写超出未定义行为的数组边界,这可能会提示您出现 Segmentation Fault 错误。
推荐阅读
- python - 在 for 循环中创建新的变量/类实例?Python网页抓取
- apache-spark - 如何在 Pyspark 数据框中将只有字符的行与字母数字作为 ID 分开?
- android - 在KSoap2.0中添加嵌套soap属性
- php - mysqli 无法使用 ssh 隧道
- 3d - 自动去除噪点后将 PLY 转换为 STL
- google-apps-script - 存储数组以在多个触发器上使用
- centos - cifs 挂载中缺少/不同的文件
- r - 使用 which() 函数 R 两个相同的 R 日期不相等
- google-apps-script - 有没有办法在更多列中获取日期
- javascript - 如何使用 CSS 或 JS 使图像在多个分区上粘贴到所需的长度?