`

字符串之strcpy

    博客分类:
  • C
阅读更多
将一个字符数组拷贝给一个指针:
#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

或将一个字符指针所指向的值拷贝给字符数组。
注意字符串指针所指向的字符串长度必须小于目标字符数组,否则会内存污染!
#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


但同样是将一个字符数组拷贝给一个字符指针的话:
#include <stdio.h> 
#include <string.h> 
int main(void) 
 { 
    char string[50]="12345678901234567890123456789012345678901234567890";
    char  *str1    ="ab";
    strcpy(str1,string);
    return 0; 
} 

程序是立刻崩溃的!
这就证明了一个经典经验:当定义字符指针为指向一个字符串常量时,如:
char  *str1="ab";
就不能改变字符串常量的值,否着会污染内存。
引用

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


结论:
strcpy(str1,str2) str1为字符串数组,或指向字符串数组的指针,字符串数组的长度硬大于str2。strcpy会将str2的值拷贝到str1中,执行类似str1[i]=str2[i]这样的运算。

分享到:
评论
5 楼 englishisxu 2011-10-29  
您好,求教:
将一个字符指针所指向的值拷贝给字符数组。
注意字符串指针所指向的字符串长度必须小于目标字符数组,否则会内存污染!
为什么你举的例子里是字符串长度大于目标字符数组呢???还是我理解错了你的意思??
4 楼 ccjsjymg 2009-04-06  
//指针常量与指向常量的指针比较分析,例如下面的example:
char string[] = "adfdfdfd";//数组名实际上是指针常量
//char const *ch = "dddddddddddddd";//ch是一个指向常量的指针
char *ch = "dddddddddddddd";
//string = "efedfdfd";//此时编译出错,string是指针常量,不能改变其指向内存的地址值
*string = *ch;//可以改变其指向的内存数据值
ch = string;//编译通过,指向常量的指针可以改变其内存的地址值
cout<<*ch<<endl;
*ch = *string;//编译出错,不能通过它改变其指向的内存数据值;
//cout<<*ch;
//strcpy(ch,string);//此时程序崩溃
3 楼 ccjsjymg 2009-04-06  
谢谢楼上的
2 楼 agurick 2009-04-06  
ccjsjymg 写道

兄弟,如果这地方strcpy(str1,string)换成这样,为什么不行?


str1指向的是常量字符串,内容是不能修改的。
1 楼 ccjsjymg 2009-04-06  
1.#include <stdio.h>   
2.#include <string.h>   
3.int main(void)   
4. {   
5.    char string[10]="123456";  
6.    char  *str1    ="abcdefghij";  
7.    //copay  a char point  to  a char array   
8.    strcpy(string,str1);  
9.    str1[2]='z';  
10.    printf("string=%s\n", string);  
11.    printf("str1=%s\n",str1);  
12.    return 0;   
13.}  
兄弟,如果这地方strcpy(str1,string)换成这样,为什么不行?

相关推荐

Global site tag (gtag.js) - Google Analytics