c - C函数strcpy()随机改变一个字符
问题描述
我正在学习 C 中的字符串函数,我似乎无法让老师的演示strcpy()
用于删除空格以在我的机器上工作,而它对他来说非常好。这是源代码:
#include <stdio.h>
#include <string.h>
int main()
{
char s[20]="abc def ghi";
char *ptr = strstr(s, " ");
while(ptr!=NULL)
{
printf("Before trim: %s\n", s);
strcpy(ptr, ptr+1);
printf("After trim : %s\n", s);
printf("\n");
ptr = strstr(s, " ");
}
return 0;
}
预期结果:
Before trim: abc def ghi
After trim : abc def ghi
Before trim: abc def ghi
After trim : abc def ghi
Before trim: abc def ghi
After trim : abc def ghi
Before trim: abc def ghi
After trim : abc def ghi
实际结果:
Before trim: abc def ghi
After trim : abc def ghi
Before trim: abc def ghi
After trim : abc def ghi
Before trim: abc def ghi
After trim : abc def hhi
Before trim: abc def hhi
After trim : abc def hii
我搜索了这个错误并了解到这strcpy()
是不安全的,因为它可能导致溢出或未定义的行为。我读过的大部分搜索都是关于目标缓冲区不够大。我不知道这种奇怪行为的关键字。有人可以向我解释我做错了什么吗?先感谢您!
解决方案
char *strcpy( char *restrict dest, const char *restrict src ); //(since C99)
将 指向的以空结尾的字节字符串
src
(包括空终止符)复制到其第一个元素指向的字符数组中dest
。如果数组不够大,则行为未定义。如果字符串重叠,则行为未定义。如果不是指向字符数组的指针或不是指向空终止字节字符串的指针,则行为未定义。
dest
dest
src
https://devdocs.io/c/string/byte/strcpy
这是老师应该小心的事情,尽管我必须说用多个版本的 MSVC、clang 和 gcc 编译代码我永远无法重现所描述的实际结果。
推荐阅读
- ruby-on-rails - 使用 HTTParty 发送多个文件
- mongodb - 单击检查按钮时如何更改vue的状态
- python - 在 python 中处理时间序列数据:对一个时间段的序列求和和聚合
- visual-studio-code - 我在哪里可以看到我拥有的 VSC 版本?
- excel - 对匹配函数的结果进行分组
- sql-server - 需要有关如何进行正确选择和更新查询的建议我不确定我哪里出错了
- c# - 按键时如何消除延迟?
- laravel - 如何使用 Laravel-Lumen 框架检查 azure 令牌(身份验证)
- node.js - 自动解析后的承诺链接
- bazel - 为 pkg_deb 的“package”和“architecture”属性选择不同的值