#include
#include
#define P 20
char *ph(char a[20],int k,int m)
{
int i;
char b[20];
for(i=0;i<k;i++)
{
b[i]=a[i];
}
b[k]='\0';
printf("%s\n",b);
return b;
}
int main()
{
char *q;
char ch[P];
int k,m;
printf("请输入");
gets(ch);
printf("%s",ch);
printf("请输入删除的位置,删除的个数");
scanf("%d%d",&k,&m);
printf("%d%d",k,m);
q=ph(ch,k,m);
printf("%s\n",q);
return 0;
}
C语言是可以返回堆栈上的变量的,但是在此之后必须把它从堆栈上复制出来,当你调用printf的时候,就把参数推上堆栈了,就把堆栈上的变量冲掉了。
为什么int就可以了呢?因为int是复制的值。而你的字符串是指针,指针指向的堆栈变量被覆盖。但是int值复制到了主程序,就不存在这个问题。
很简单的道理,返回的是b数组的地址,但是b数组的作用域只在函数中,函数调用完毕后b数组中的内容被清空,所以显示的是乱码。
更改后的代码如下:
#include
#include
#define P 20
char* ph(char a[20], int k, int m)
{
int i;
static char b[20];
for (i = 0; i<k; i++)
{
b[i] = a[i];
}
b[k] = '\0';
printf("%s\n", b);
return b;
}
int main()
{
char *q;
char ch[P];
int k, m;
printf("请输入");
gets_s(ch);
printf("%s", ch);
printf("请输入删除的位置,删除的个数");
scanf("%d%d", &k, &m);
printf("%d%d\n", k, m);
q = ph(ch, k, m);
printf("%s\n", q);
return 0;
}
b数组分配的空间的作用域仅在函数中,函数调用后数组销毁,所以会返回乱码。你可以将b生命为全局数组解决这个问题
还是把b作为一个指针参数,传进去再改变值。