函数中为何还要定义一个新的指针

新手上路,请多包涵

在字符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);

}
阅读 2.9k
3 个回答

对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之后应该出现的结果,这真的是你想要的吗。。附上修改后的第一题。

#include"stdio.h"
#include"string.h"
#define M 11
void insert(char *m, char *n, char f);
int main()
{
    char s1[M], s2[M], f;
    printf("please input s1:");
    gets(s1);
    printf("please input s2:");
    gets(s2);
    printf("please input f:");
    f = getchar();
    printf("the sorted s is:");
    insert(s1,s2,f);
}

void insert(char *m,char *n,char f)
{
    char *p1 = m;//why在这里要多定义一个*p1?直接用m操作(即下面注释掉的)的话什么也输出不了。
    while (*p1 != f)
    {
        printf("%c", *p1);
        p1++;
    }

    for (; *n != 0; n++)//这里为什么不需要加个*p2一样可行?
    {
        printf("%c", *n);
    }
    printf("%s", p1);

}

顺带一提,代码风格还有待提高,我指的是关于空格(不想挑起大括号战争,我对大括号的态度是whatever,保持一致即可)。

并非是由于指针的赋值问题(当然,我不推荐在函数内直接操作参数),关键问题在于你下面的

while(*m!=f);

后面的分号就等同于

while(*m!=f)
{
//do nothing!
};

写代码还是要细心些呢!:)

楼主仔细看代码

while(*m!=f);  // while 后面有一个分号,致命的错误

去掉以后正常运行

void insert(char*m,char*n,char f)
{
    while(*m!=f)
    {
        printf("%c",*m);
        m++;
    }
    for(;*n!=0;n++)
    {
        printf("%c",*n);
    }
    printf("%s",p1);

}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进