一个C字符串和字符指针的问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 14:50:58
#include "stdio.h"
void main()
{
char s[20]="student",*s1="teacher";
int n;
void insert(char *s,char *s1,int n);
printf("\ns=%s\ts1=%s",s,s1);
printf("\ninput n:");
scanf("%d",&n);
insert(s,s1,n);
printf("\ns=%s",s);
}
void insert(char *s,char *s1,int i)
{
char *p,*q,*r;
p=s+strlen(s)+strlen(s1);
q=s+strlen(s);
for( ;q>=s+i; )
*(p--)=*(q--);
p=s+i;
r=s1;
for( ;(*r)!='\0';p++,r++)
*p=*r;
}
运行进输入n:3
结果:s=stuteacherdent 是正确的.
而把main()下面的那个定义:改成char *s="student",*s1="teacher";
结果则为s=stutedentedent 是错误的
这是为什么呢??
希望能给出较详细的解答!谢谢!

因为将S[20] 改成指针后,你为S分配的空间就是只有strlen("student")大小,而你在insert函数的P指针就会越界,而如果是数组S[20]的空间就会满足.

如果要改成指针的话
我帮你改了下代码,你看下

在VC++6.0下编译运行通过

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define Max_Size 20
void main()
{
char *s=NULL,*s1="teacher";
s=(char *)malloc(Max_Size);
strcpy(s,"student");
int n;
void insert(char *s,char *s1,int n);
printf("\ns=%s\ts1=%s",s,s1);
printf("\ninput n:");
scanf("%d",&n);
insert(s,s1,n);
printf("\ns=%s",s);
free(s);
}

void insert(char *s,char *s1,int i)
{
char *p,*q,*r;
p=s+strlen(s)+strlen(s1);
q=s+strlen(s);
for( ;q>=s+i; )
*(p--)=*(q--);
p=s+i;
r=s1;
for( ;(*r)!='\0';p++,r++)
*p=*r;
}

请参照下面将程序添加日志,