在字符s1指定字符f位置插入字符s2
#include"stdio.h"
#include"string.h"
#define M 11
void insert();
main()
{
char s1[M],s2[M],f;
char *p1=s1,*p2=s2;
printf("please input s1:");
gets(s1);
printf("please input s2:");
gets(s2);
printf("please input f:");
f=getchar();
printf("the sorted s is:");
insert(p1,p2,f);
}
void insert(char*m,char*n,char f)
{
char *p1=m;//why在这里要多定义一个*p1?直接用m操作(即下面注释掉的)的话什么也输出不了。
while(*p1!=f)
{
printf("%c",*p1);
p1++;
}
/*如果上面那段写成下面这样编译就会报错
while(*m!=f);
{
printf("%c",*m);
m++;
}
*/
for(;*n!=0;n++)//这里为什么不需要加个*p2一样可行?
{
printf("%c",*n);
}
printf("%s",p1);
}
然而对另一道题
在s1指定位置插入s2
#include"stdio.h"
#include"string.h"
#define M 11
void insert();
main()
{
char s1[M],s2[M],f;
char *p1=s1,*p2=s2;
int d;
printf("please input s1:");
gets(s1);
printf("please input s2:");
gets(s2);
printf("please input a number less than %d as position:",M-1);
scanf("%d",&d);
printf("the sorted s is:");
insert(p1,p2,d);
}
void insert(char*m,char*n,int d)
{
//char *p1=m;//why这里不要像上面一样再定义一个p?
int i=0;
for(;i<d;i++,m++)
{
printf("%c",*m);
}
for(;*n!=0;n++)
{
printf("%c",*n);
}
printf("%s",m);
}
对C语言不熟,所以我试了一下。
首先,我不认为编译可以通过,insert()的两次定义不一样。gcc和cc都给我报错了,修改定义以后解决。
其次,关于重新定义这个问题我认为不必太纠结,之所以在insert中重新赋值把m给p1是因为要修改值,如果直接对m进行递增,假如传入的是s1,那么之后你就没法找回s1了(假如与此同时在main中也没有把s1赋值给p1)。比较简洁的做法是删掉main中的,
char *p1=s1, *p2=s2
然后叫insert(s1, s2, f)
。然后在insert中把s1赋值给一个临时变量。第二个问题既然只读,那么自然是不用再赋值了。关于注释中用
while(m != f)
的打印问题,我试了,仍然可以使用 (但是输出结果就不一样了)。你的编译问题应该来自insert()。需要指出的是其实题主的程序并没有真的insert,只是打印了insert之后应该出现的结果,这真的是你想要的吗。。附上修改后的第一题。
顺带一提,代码风格还有待提高,我指的是关于空格(不想挑起大括号战争,我对大括号的态度是whatever,保持一致即可)。