浏览 4570 次
锁定老帖子 主题:字符串之strcpy
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (7)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-21
最后修改:2009-01-21
#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]这样的运算。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-04-06
最后修改: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)换成这样,为什么不行? |
|
返回顶楼 | |
发表时间:2009-04-06
最后修改:2009-04-06
ccjsjymg 写道 兄弟,如果这地方strcpy(str1,string)换成这样,为什么不行? str1指向的是常量字符串,内容是不能修改的。 |
|
返回顶楼 | |
发表时间:2009-04-06
谢谢楼上的
|
|
返回顶楼 | |
发表时间: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);//此时程序崩溃 |
|
返回顶楼 | |