【问题标题】:strcpy () not working properlystrcpy() 不能正常工作
【发布时间】:2013-03-30 01:46:37
【问题描述】:

我目前正在编写一个程序,其中我陷入了 strcpy() 函数的另一种行为。这是它的简短演示......

我遇到了以下问题:Strip first and last character from C string

//This program checks whether strcpy() is needed or not after doing the modification in the string 
#include <stdio.h>
#include <string.h>

int main()
{
        char mystr[] = "Nmy stringP";
        char *p = mystr ;
        p++;

        p[strlen(p)-1] = '\0';
        strcpy(mystr,p);
        printf("p : %s mystr: %s\n",p,mystr);

}

输出:-

p : y strnng mystr: my strnng

如果我不使用 strcpy() 函数,那么我会得到

p : my string mystr : Nmy string 

为什么会这样??

【问题讨论】:

  • 我认为您不能将strcpy 与重叠的源和目标一起使用。
  • 您不能重叠strcpy() 源缓冲区和目标缓冲区的内存。如果您这样做,行为是未定义的。见the documentation
  • 深入了解之前的一般提示:永远不要使用 strcpy。它是太多糟糕代码和太多系统漏洞的根源。 strncpy 是首选。
  • memcpy() 更可取,memmove() 或重叠。要么强迫你做你最终总是用strncpy()做的事情:即硬终止目标缓冲区。 srtncpy() 很好(我经常使用它),但知道它是如何工作的(即它总是完全写入 n 字符,仅此而已)很重要。
  • @MarcB:strcpy 不是系统漏洞的来源;糟糕的系统设计是系统漏洞的根源......并且strncpy 不被排除在糟糕的系统设计之外。使用strncpy 会引入一类新的漏洞:由于缺少'\0' 终止而导致的信息泄露。在设计良好的算法中使用 strcpy 完全没有问题。

标签: c string strcpy


【解决方案1】:

标准说:

7.24.2.3

如果复制发生在重叠的对象之间,则行为是 未定义。

您可以使用memmove 或完全不同的方法。

【讨论】:

    【解决方案2】:

    您不能将strcpy 用于重叠的内存位置,即如果源字符串和目标字符串重叠。在这种情况下,行为是未定义的,如标准中所述。

    但您可以使用temp 内存位置进行交换,例如this

    【讨论】:

      猜你喜欢
      • 2021-08-05
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2010-11-30
      • 2021-10-02
      • 2017-08-06
      • 2013-11-22
      相关资源
      最近更新 更多