`

字符串之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)换成这样,为什么不行?

相关推荐

    不使用库函数strcpy(),编程实现将字符串b复制到字符串a中。.c

    不使用库函数strcpy(),编程实现将字符串b复制到字符串a中,不使用库函数strcpy(),编程实现将字符串b复制到字符串a中,不使用库函数strcpy(),编程实现将字符串b复制到字符串a中,不使用库函数strcpy(),编程实现将...

    【字符串函数】strcpy的使用及原理

    在C语言中,`strcpy`是一个非常基础且重要的字符串处理函数,它用于复制一个字符串到另一个字符串中。本文将深入探讨`strcpy`的使用方法、原理以及相关的注意事项。 `strcpy`函数是C标准库`string.h`中的一部分,其...

    C语言字符串练习(习题+答案).zip

    1. 字符串初始化与复制:了解如何初始化字符串,以及如何使用strcpy()函数进行字符串复制,避免缓冲区溢出的问题。 2. 字符串比较:熟悉strcmp()函数的用法,用于比较两个字符串是否相等或按字典顺序排列。 3. ...

    C语言程序设计-用函数实现字符串的复制, 不允许用strcpy()函数.c

    C语言程序设计-用函数实现字符串的复制, 不允许用strcpy()函数.c

    编写函数void fun(char *s,char *t,char *p)将未在字符串s中出现、而在字符串t中出现的字符, 形成一个新的字符串放在p中,p中字符按原字符串中字符顺序排列,但去掉重复字符。

    根据给定的信息,我们需要实现一个C语言函数`void fun(char *s,char *t,char *p)`,该函数的功能是:将未在字符串`s`中出现、而在字符串`t`中出现的字符形成一个新的字符串并存储在指针`p`指向的空间内。新字符串中...

    将字符串str1 拷贝到str2中

    ### 字符串拷贝知识点详解 #### 一、概述 在C语言中,字符串是由字符组成的数组,并且最后一个字符必须是空字符`'\0'`。字符串操作是编程中的常见需求,例如拷贝一个字符串到另一个字符串。本篇文章将详细探讨如何...

    C语言实现字符串循环右移

    在计算机科学中,字符串操作是非常常见的任务之一。其中,字符串的循环移动是一种特殊的字符串操作方式,它涉及到将字符串中的字符按照特定的方式重新排列。本篇文章的目标是实现一个函数,该函数可以将一个给定的...

    数据结构(线性表和字符串部分)

    4. **字符串的常用函数**:C语言中的`&lt;string.h&gt;`库提供了许多字符串处理函数,如`strlen()`计算字符串长度,`strcpy()`和`strncpy()`复制字符串,`strcmp()`比较字符串,`strtok()`分割字符串等。 在`线性表上机....

    字符串处理函数列表,字符串处理函数列表

    19. strcpy:将一个字符串复制到另一个字符串,不包括结束的空字符。 20. strcspn:返回字符串中连续不含指定子字符串的字符数。 21. strdup:动态分配内存并复制一个字符串,返回一个新字符串。 22. strfry:将...

    SIMATIC Wincc中与字符串相关的函数使用方法(拷贝_比较_连接_转换)及举例说明.docx

    1. **strcpy()**:这个函数用于拷贝一个字符串到另一个字符串。在示例中,`pszValue` 的值被复制到 `a` 中。`strcpy()` 需要谨慎使用,因为它不检查目标字符串的长度,可能导致缓冲区溢出。为了安全起见,通常推荐...

    C语言写字符串函数及任意个数求和

    C语言本身并不像其他高级语言那样内置了丰富的字符串操作函数,但通过标准库中的`&lt;string.h&gt;`我们可以使用一些基本的字符串函数,如`strcpy`、`strlen`等。然而,为了更好地理解和掌握C语言,有时我们需要自己动手...

    c语言字符串操作(包括字符串各种操作)

    strcpy()函数将源字符串的每个字节拷贝到目录字符串中,当遇到字符串末尾的null字符(\0)时,它会删去该字符,并结束拷贝。 memcpy()函数可以拷贝任意类型的数据。因为并不是所有的数据都以null字符结束,所以您要为...

    将一个字符串循环右移的三种方法

    `strcpy()`函数用于复制字符串,我们可以利用这一特性,先创建一个临时字符串,将原字符串的后部分复制到临时字符串的开头,再将原字符串的前部分复制到原字符串的末尾,最后将临时字符串复制回原字符串的开头。...

    C语言字符、字符串定义及相关函数

    strcpy函数则实现将源字符串复制到目标字符串的指定内存位置,并返回目标字符串的指针。strncat和strncpy是strcat和strcpy的变体,它们仅复制源字符串的前n个字符。strncmp与strcmp相似,但只比较前n个字符。...

    字符串与指针

    通过`strcpy`函数将字符串复制到`s1`中,接着将`s2`的地址赋给了另一个指针`p2`。之后使用一个`for`循环,将`s1`中的内容逐个字符地复制到`s2`中,直至遇到字符串的结束符`'\0'`。 #### 三、具体操作分析 1. **...

    字符数组转换成字符串

    这里需要使用字符串函数,如`strcpy`、`strcat`等。下面是一个例子: ```c char arr[20]; scanf("%s", arr); // 从用户输入读取字符串 // 或者 fscanf(stdin, "%s", arr); // 从标准输入流读取字符串 // 现在arr是...

    字符串操作函数大全(String)

    strcpy 函数也是字符串拷贝函数之一,它可以将源字符串拷贝到目的字符串中。该函数的原型为: `char* strcpy(char* str1,char* str2)` 函数功能:把 str2 指向的字符串拷贝到 str1 中去。 函数返回:返回 str1,...

    求字符串长度、比较字符串 、复制 、连接——C语言程序

    复制字符串可以使用strcpy函数,该函数的实现方法如下: ```c char *strcpy(char *s,char *s1){ int i; for(i=0;i;i++) *(s+i)=*(s1+i); return s; } ``` 这个函数使用了指针操作,将源字符串的内容复制到目标...

Global site tag (gtag.js) - Google Analytics