使用字符指针的字符串复制

时间:2017-06-07 09:34:49

标签: c arrays pointers

考虑下面的代码,它可以很好地复制字符串

#include<stdio.h>

void strcp(char *s1, char *s2);

int main() {

    char s1[]="Hai, I am a good boy";                   //1
    char s2[]="Really I am a good boy";                 //2

    strcp(s1,s2);

    printf("%s",s1);
    return 0;
}

void strcp(char *s1, char *s2) {

    while(*s1++=*s2++);
}

如果我想将s1, s2声明为main()内的char指针,我必须做出哪些更改?

char *s1="Hai, I am a good boy";                   //1
char *s2="Really I am a good boy";                 //2

我尝试复制指针值,如下所示

void strcp(char *s1, char *s2) {

s1=s2;
}

但它没有用。

4 个答案:

答案 0 :(得分:2)

void strcp(char **s1, char **s2) {

*s1=*s2;
}

但它不会复制任何内容。在此之后s1&amp; main中的s2将指向相同的内存位置。

答案 1 :(得分:1)

这两个版本,即使是你声称它工作正常的版本,也会产生未定义的行为,这可能会在分段错误中变得明显。 通常,访问存储器要求所寻址的存储器有效,即正确分配。对于写入内存尤其如此,就像任何类型的strcpy一样。

在第一种情况下,您定义一个变量char s1[]="Hai, I am a good boy",它隐含地保留一个大约21个字节的内存块并复制提供给它的字符串文字。如果现在将另一个字符串复制到s1,而另一个字符串长度超过21个字节,则实际上会解决未为s1保留的内存,从而产生未定义的行为。

在第二种情况下,当您定义变量char *s1="Hai, I am a good boy"时,不会保留您可以写入的内存块,但s1将指向不可写数据段中的内存块文字"Hai, I am a good boy"所在的位置。将某些内容复制到此地址会再次产生未定义的行为,但原因不同。

s1分配内存,例如使用malloc,然后将内容复制到其中。

答案 2 :(得分:1)

首先,您无法修改文字字符串,即const。 第二,你的函数strcp()并不关心如果你传递一个指向字符或字符数组的指针,它应该适用于两种情况。当你只键入s1时,数组转换为指向char的指针到数组的第一个元素。

s1 - &gt;(char *)&amp; s1 [0]

由于你无法修改文字字符串,你可以做的只是切换指针:

void strcp(char **s1, char **s2) { 
char *temp = *s1;
       *s1 = *s2;
       *s2 = temp;
}

答案 3 :(得分:-2)

#include<stdio.h>

void strcp(char *s1, char *s2);

int main() {
    char *s1 = "Hi, I am a good boy";                   //1
    char *s2 = "Really!! I am a good boy";              //2

    strcp(&s1,&s2); //Pass Address to function 

    printf("s1 = %s", s1);
    printf("\ns2 = %s", s2);

    return 0;
}

/*
 * This method takes pointer address as arguments and simply swap the address 
 * pointing to string (i.e. char array).
 */
void strcp(char *s1, char *s2) { 
    char *temp = *s1;
           *s1 = *s2;
           *s2 = temp;
}

O / P:

s1 =真的!!我是个好孩子 s2 =嗨,我是个好孩子

http://ideone.com/wTH4VO