我正在使用指针动态编写一个复制字符串程序。该函数从main()
调用,复制的字符串显示在main()
中,但当我尝试在函数本身中显示复制的字符串时,只有光标闪烁。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
void copystr(char *p,char *s);
int main ()
{
char str[50],*ptr,*p;
printf("enter the string\n");
gets(str);
ptr=malloc(50*sizeof(char));
copystr(ptr,str);
getch();
return 0;
}
void copystr(char *p,char *s)
{
s=malloc(50*sizeof(char));
while(*s!='\0')
{ *p=*s;
s++;
p++;
}
*p='\0';
printf("copy string is %s", p); // if i display this printf in main 'p' prints fine, but here no output
free(p);
}
可能是什么原因?
答案 0 :(得分:3)
<强>问题强>
gets()
。它严重受缓冲区溢出问题的影响。请改用fgets()
。sizeof(char)
中的1
保证为C
。乘以sizeof(char)
实际上是多余的。s
中接收copystr()
作为传入参数之一,然后立即执行s=malloc(50*sizeof(char));
。在这里,您将丢失传入的指针。所有进一步的操作都毫无意义。malloc()
将返回NULL。在这种情况下,进一步使用返回的指针将导致undefined behaviour。malloc()
会返回未初始化的内存。在malloc()
之后,直接写while(*s!='\0')
即读取未初始化内存的内容。调用undefined behaviour。copystr()
内,您正在递增收到的指针p
,并在复制后重新添加空终止符。因此p
的当前值指向null终止符。因此,在p
中使用printf()
根本不会为您提供任何输出。<强>溶液强>
ptr
之后malloc()
添加NULL检查以检查是否成功。malloc()
内s
上的copystr()
。p
的传入值。在您使用p
获取存储的值后,使用临时指针打印复制的字符串。答案 1 :(得分:3)
printf("copy string is %s", p); // if i display this printf in main 'p' prints fine, but here no output
因为p
没有指向该函数中字符串的开头(即使您已使用s=malloc(50*sizeof(char))
修复了问题)。
如果您:
free(p);
就像你现在拥有它一样,你也无法使用原版ptr
。
答案 2 :(得分:0)
你不需要函数中的malloc - 它会删除你传递给函数的数据 - 尝试重新运行函数中的代码
删除该行
s=malloc(50*sizeof(char));
另外,您可能希望在调用复制例程之后将一些东西放在main中以打印出您复制的函数,这样您就知道它有效了。 (还要注意在所有p ++操作之后用指针p打印字符串的问题,如其他答案所述)
下面的工作代码包含这些更改 - 请注意,最好不要使用获取... scanf完成工作...
#include<stdio.h>
#include<stdlib.h>
void copystr(char *p,char *s);
int main ()
{
char str[50],*ptr,*p;
printf("enter the string\n");
// gets(str);
scanf("%s",str);
ptr=malloc(50*sizeof(char));
copystr(ptr,str);
printf("copy string is %s\n", ptr); // if i display this printf in main 'p' prints fine, but here no output
free(ptr);
// getch();
return 0;
}
void copystr(char *p,char *s)
{
while(*s!='\0')
{ *p=*s;
s++;
p++;
}
*p='\0';
}
使其在函数中起作用....参见
#include<stdio.h>
#include<stdlib.h>
void copystr(char *p,char *s);
int main ()
{
char str[50],*ptr,*p;
printf("enter the string\n");
// gets(str);
scanf("%s",str);
ptr=malloc(50*sizeof(char));
copystr(ptr,str);
free(ptr);
// getch();
return 0;
}
void copystr(char *p,char *s)
{
int i=0;
while(*s!='\0')
{ *(p+i)=*s;
s++;
i++;
}
*(p+i)='\0';
printf("copy string is %s\n", p); // if i display this printf in main 'p' prints fine, but here no output
}