愈伤组织 发表于 2019-3-19 22:30:38

字符串处理函数之strcpy函数

1.第一个问题str1 长度是16,str2的长度是11 然后执行了strcpy(str2,str1)命令后str2 变成了如图Original St 此时的str2的长度为12请问这是怎么一回事情
2.第二个问题也就是str2存放的是Original St 为何打印输出Original String?

ba21 发表于 2019-3-19 22:41:12

strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。

这是一种不安全的复制方式,不同编译器结果应该不一样,可能还会报错。
你这里
str1 复制到 str2,把原来str2及str2后面的空间都用str1覆盖掉了.所以最终完全打印str1的内容

愈伤组织 发表于 2019-3-20 18:58:45

ba21 发表于 2019-3-19 22:41
strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空 ...

咦那还是有问题啊
1.str1复制到str2 既然是复制,那为什么最后打印输出的结果是ring?
2.为什么在debug中str2中的内容为Original St 打印输出为Original String?

ba21 发表于 2019-3-20 20:19:24

本帖最后由 ba21 于 2019-3-20 20:31 编辑

愈伤组织 发表于 2019-3-20 18:58
咦那还是有问题啊
1.str1复制到str2 既然是复制,那为什么最后打印输出的结果是ring?
2.为什么在debug ...

自己琢磨吧!
/*
1. 栈 地址从高地址到低地址分配栈的
2. 栈 入栈是由右至左
3. 栈 先进后出

strcpy 把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间 返回指向dest的指针。

// 2、str2 入栈
N // N 最后进
e
w

S
t
r
i
n
g
'\0'// '\0' 先进
// 1、str1 入栈
O// O 最后进
r
i
g
i
n
a
l

S
t
r
i
n
g
'\0'// '\0' 先进

*/


图上 str1 str2 还是原来的地址,并没有改变。

参考代码:
#include <stdio.h>
#include <string.h>

int main()
{
        char str1[]={"Original String"}; // 有\0
        char str2[]="New String"; // 有\0
        char *newstr1;

        newstr1 = strcpy(str2, str1); // 把str2的地址,返回给newstr1

        printf("%s\n", str1);
        printf("%s\n", str2);
        printf("%s\n", newstr1);

        return 0;

}
页: [1]
查看完整版本: 字符串处理函数之strcpy函数