梵洛何
2015-01-10 07:15
采纳率: 18.2%
浏览 1.6k
已采纳

关于strcpy的问题,求解答

将第二个字符串复制到第一个字符串时第一个字符串后面的长于第二个字符串的字符会收到影响吗
如第一个字符串是a[15]="how do you do"第二个字符串是"what is it"输出a时还有后面的do吗

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • blownewbee 2015-01-10 07:47
    已采纳

    复制的时候是连\0一起复制的,所以复制的结果是
    what is it\0do\0...
    如果你用printf去输出,它输出到\0就为止了,不再输出后面的东西。

    从内存的角度讲,还在,但是显示的时候没了。

    点赞 打赏 评论
  • blownewbee 2015-01-10 07:40

    很好的问题,strcpy是一个很危险的函数,它不会做边界检查,所以如果你复制的内容超过了缓冲区,结果将无法预料。
    这取决于正好位于缓冲区后面的内存分配给了什么,如果是另一个变量,那么那个变量的值会被超长的内容冲掉。
    如果后面的内存是代码,那更可怕,程序会执行莫名其妙的指令。
    你如果用printf或者strlen之类的函数去测量,会报告或者显示完整的字符串,因为它们同样根据\0而不是长度判断字符串的结束。

    点赞 打赏 评论
  • 91program 2015-01-10 07:48

    按字符串来操作,是不会有 do 输出的,因为有字符串结束符也会将 Copy 到第一个字符串中。这是指使用 strcpy 函数!
    如果使用 strncpy 函数,且指定了长度是 10,这时就不会复制字符串结束符,则会有 do 输出。
    所以,字符串复制也要看使用什么样的字符串复制函数、具体是如何使用的、被复制的字符串与相关参数的设置,这样都会影响字符串复制的执行结束。

    点赞 打赏 评论
  • blownewbee 2015-01-10 07:51

    看这个程序

     #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        char s1[] = "1234567890";
        char s2[] = "12345";
        char *p = new char[15];
        strcpy(p, s1);
        printf("%s\n", p);
        strcpy(p, s2);
        printf("%s\n", p);
        printf("%s\n", p+6);
    }
    
    点赞 打赏 评论
  • blownewbee 2015-01-10 07:51

    输出
    1234567890
    12345
    7890

    点赞 打赏 评论
  • blownewbee 2015-01-10 07:52

    http://codepad.org/7gJqdmg4

    这说明虽然输出的是12345,但是其实7890还在。

    点赞 打赏 评论

相关推荐 更多相似问题