首页 > 解决方案 > 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()是不安全的,因为它可能导致溢出或未定义的行为。我读过的大部分搜索都是关于目标缓冲区不够大。我不知道这种奇怪行为的关键字。有人可以向我解释我做错了什么吗?先感谢您!

标签: cstrcpy

解决方案


char *strcpy( char *restrict dest, const char *restrict src ); //(since C99)

将 指向的以空结尾的字节字符串src(包括空终止符)复制到其第一个元素指向的字符数组中dest

如果数组不够大,则行为未定义。如果字符串重叠,则行为未定义。如果不是指向字符数组的指针或不是指向空终止字节字符串的指针,则行为未定义。destdestsrc

https://devdocs.io/c/string/byte/strcpy

这是老师应该小心的事情,尽管我必须说用多个版本的 MSVC、clang 和 gcc 编译代码我永远无法重现所描述的实际结果。


推荐阅读