user-0 提问: 求修改 复制字符串的问题 

回复:
user: user-1
content: 第一，字符串是char*，字符是char 第二，你主函数中的的p都没有申请内存，你不能直接使用*p  所以：   #include<stdio.h> char* copying(char *p) { 	char *p1; 	while(*p!='\0') 	{ 		*p1=*p; 		p1++; 		p++; 	} 	*p1='\0'; 	return p1; } main() { 	char *p,s[80]; 	printf("please input astring:\n"); 	scanf("%s",s); 	p=copying(s); 	printf("%s",*p); }

user: user-2
content: 1.返回的应该是char * 2.应该在copying函数里malloc一块空间用来存放拷贝的字符串 3.用一个指针记录p1最初始的位置，因为你之后有++操作，p1指向会后移  #include<stdio.h> #include<stdlib.h> char *copying(char *p) { 	char *p1 = (char *)malloc(80); 	char *res = p1; 	while(*p!='\0') 	{ 		*p1=*p; 		p1++; 		p++; 	} 	*p1='\0'; 	return res; } void main() { 	char *p,s[80]; 	printf("please input astring:\n"); 	scanf("%s",s); 	p=copying(s); 	printf("%s\n",p); }

user: user-3
content: 不看其他的，首先main函数里char *p，*p=...就错了

user: user-4
content: #include<stdio.h> char copying(char *p) { char *p1; while(*p!='\0') { *p1=*p;//这是一个错误的做法。p1声明后，没有分配内存块，直接指向*p的值.p1会把值存放在哪里，这是一个未知的. p1++; p++; } *p1='\0';//这里j是什么意思？ return *p1;//返回'\0'？？？？ } main() { char *p,s[80]; printf("please input astring:\n"); scanf("%s",s);//这里不能用scanf，楼主可以调试一下，如果用scanf获取字符串。然后把s做为实参给copying函数，会发现只得到两个字符。strlen(p)也得不到一个正常的长度。 *p=copying(s);   //copying函数里最后return *p1  是返回'\0'，楼主你知道吗？就算copying函数里前面的步骤不出错，这里也是错误的。 printf("%s",*p); }

user: user-4
content: #include<stdio.h> #include "string.h" void copying(char *p) { char p1[80]; int i=0; int clen=strlen(p);//获得长度 while(i<clen) { p1[i]=*p; p++; i++; } for(int j=0;j<clen;j++) { 	printf("%c",p1[j]); } printf("\n"); } main() { char *p,s[80]; printf("please input astring:\n"); gets(s); copying(s); }  帮你修改了一下。

user: user-5
content: 引用 12 楼 ghx287524027 的回复: #include<stdio.h> #include<stdlib.h> char * copying(char *p) { 	char *p1,*p2;//申请一个p2用来记录p1的起始位置，因为后面p1的志向发生了变化，返回时要返回p2 	p2=p1=(char *)calloc(1,100); 	while(*p!='\0') 	{ 		*p1=*p; 		p1++; 		p++; 	} 	*p1='\0'; 	return p2; }  void main() { 	char *p=NULL,s[80]; 	printf("please input astring:\n"); 	scanf("%s",s); 	p=copying(s); 	printf("%s\n",p);	//输出的是p而不是*p }   内存用完之后可以free掉，切记free的是内存而不是指针

user: user-5
content: #include<stdio.h> #include<stdlib.h> char * copying(char *p) { 	char *p1,*p2;//申请一个p2用来记录p1的起始位置，因为后面p1的志向发生了变化，返回时要返回p2 	p2=p1=(char *)calloc(1,100); 	while(*p!='\0') 	{ 		*p1=*p; 		p1++; 		p++; 	} 	*p1='\0'; 	return p2; }  void main() { 	char *p=NULL,s[80]; 	printf("please input astring:\n"); 	scanf("%s",s); 	p=copying(s); 	printf("%s\n",p);	//输出的是p而不是*p }

user: user-6
content: 1   #include<stdio.h>                                                                                                                                                                                           1          2 #define    MAX_LEN    128     3          4 char *copying(char *p)     5 {    >>  6     char *p1 = malloc(sizeof(char) * MAX_LEN);     7     if (NULL == p1) {    //判断申请结果 >>  8     |   fprintf(stderr, "malloc Error: %s\n", strerror(errno));     9     |   return NULL;    10     }    11     char *ptmp = p1;    12     while(*p!='\0') {    13     |   *ptmp++ = *p++;    14     }    15     *ptmp = '\0';    //字符串结束标志,添加上    16         17     return p1;    18 }       19 int main(void)    20 {       21     char *p = NULL, s[80];    22     printf("please input astring:\n");    23     scanf("%s", s);    24     p = copying(s);    25     printf("%s\n", p); >> 26     free(p);    //用完释放    27         28     return 0;    29 }

user: user-1
content: 引用 6 楼 qq_35109846 的回复:楼上的不对啊 有错  你copying函数里也要分配内存，上面代码没帮你改

user: user-2
content: 引用 7楼我是你的主体 的回复:四楼正解   可是我之前很少用到*res   啥时候要用这个只是保存一下p1最初始的地址，否则的话你之后++了，return的时候返回的是最后一个\0的地址

user: user-0
content: 引用 1 楼 chendepeng17 的回复:#include<stdio.h> #include "string.h" void copying(char *p) { char p1[80]; int i=0; int clen=strlen(p);//获得长度 while(i<clen) { p1[i]=*p; p++; i++; } for(int j=0;j<clen;j++) { 	printf("%c",p1[j]); } printf("\n"); } main() { char *p,s[80]; printf("please input astring:\n"); gets(s); copying(s); }  帮你修改了一下。                运行不了

user: user-0
content: 四楼正解   可是我之前很少用到*res   啥时候要用这个

user: user-0
content: 楼上的不对啊 有错