c - “C 中的 strcat 函数假定目标字符串大到足以容纳源字符串及其自身的内容”中的混淆。
问题描述
所以我读到这个strcat
函数要小心使用,因为目标字符串应该足够大以容纳它自己和源字符串的内容。我编写的以下程序也是如此:
#include <stdio.h>
#include <string.h>
int main(){
char *src, *dest;
printf("Enter Source String : ");
fgets(src, 10, stdin);
printf("Enter destination String : ");
fgets(dest, 20, stdin);
strcat(dest, src);
printf("Concatenated string is %s", dest);
return 0;
}
但我在这里写的不是这样:
#include <stdio.h>
#include <string.h>
int main(){
char src[11] = "Hello ABC";
char dest[15] = "Hello DEFGIJK";
strcat(dest, src);
printf("concatenated string %s", dest);
getchar();
return 0;
}
该程序最终将两者都添加了,而没有考虑到目标字符串不够大。为什么会这样?
解决方案
该strcat
函数无法确切知道目标缓冲区的长度,因此它假定传递给它的缓冲区足够大。如果不是,则通过写入缓冲区末尾来调用未定义的行为。这就是第二段代码中发生的事情。
第一段代码也是无效的,因为src
和dest
都是未初始化的指针。当您将它们传递给 时fgets
,它会读取它们包含的任何垃圾值,将其视为有效地址,然后尝试将值写入该无效地址。这也是未定义的行为。
使 C 快速的一件事是它不会检查以确保您遵守规则。它只是告诉你规则并假设你遵守它们,如果你不这样做,坏事可能会发生也可能不会发生。在您的特定情况下,它似乎有效,但不能保证。
例如,当我运行您的第二段代码时,它似乎也可以工作。但如果我把它改成这样:
#include <stdio.h>
#include <string.h>
int main(){
char dest[15] = "Hello DEFGIJK";
strcat(dest, "Hello ABC XXXXXXXXXX");
printf("concatenated string %s", dest);
return 0;
}
程序崩溃。
推荐阅读
- javascript - 根据 URL 设置状态是一种反模式吗?
- sql - AWS Athena SQL 基于一列和一个静态值添加 date_diff 列
- ios - 实例化 Nib 并访问它的子视图
- php - Wordpress REST API 自定义帖子类型 DELETE 访问被禁止
- wordpress - 在 WordPress 中批准评论时重定向到 URL
- c# - 覆盖第二个可选参数,同时保留第一个可选参数
- c - C 程序卡在类似无限循环的 nautre 中,但没有打印任何变量
- java - 正在同步的字符串缓冲区有什么用
- python - 如何将一组数据框中的列值替换为与另一组数据框相比
- android - 可展开列表视图内的列表视图