字符串之strcpy

将一个字符数组拷贝给一个指针:

#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10]="123456";
char *str1 ="abcdefghij";
//copay a char array to a char point
strcpy(str1, string);
string[2]='z';
printf("string=%s\n", string);
printf("str1=%s\n",str1);
return 0;
}


string=12z456
str1=123456

或将一个字符指针所指向的值拷贝给字符数组。
[color=red]注意字符串指针所指向的字符串长度必须小于目标字符数组,否则会内存污染![/color]

#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10]="123456";
char *str1 ="abcdefghij";
//copay a char point to a char array
strcpy(string,str1);
str1[2]='z';
printf("string=%s\n", string);
printf("str1=%s\n",str1);
return 0;
}


string=abcdefghij
str1=abzdefghij


[color=red]但同样是将一个字符数组拷贝给一个字符指针的话:[/color]

#include <stdio.h>
#include <string.h>
int main(void)
{
char string[50]="12345678901234567890123456789012345678901234567890";
char *str1 ="ab";
strcpy(str1,string);
return 0;
}

程序是立刻崩溃的!
这就证明了一个经典经验:当定义字符指针为指向一个字符串常量时,如:
char *str1="ab";
就不能改变字符串常量的值,否着会污染内存。
[quote]
数组和指针都可以在它们的定义中用字符串常量进行初始化。尽管看上去一样,底层的机制却不想同。
定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针一个字符串常量进行初始化。例如,下面的定义创建了一个字符串常量(为其分配了内存):
char *p="breadfruit";
注意只有对字符串常量才是如此。不能指望为浮点数之类的常量分配空间,如:
float *pip=3.141; /*错误!无法通过编译*/
在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
数组也可以用字符串常量进行初始化:
char a[]="gooseberry";
与指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变,比如下面的语句:
strncpy(a,"black",5);
就将数组的值修改为"blackberry"。
摘录自《C 专家编程》
[/quote]

[color=red]结论:
strcpy(str1,str2) str1为字符串数组,或指向字符串数组的指针,字符串数组的长度硬大于str2。strcpy会将str2的值拷贝到str1中,执行类似str1[i]=str2[i]这样的运算。
[/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值