注册 登录
编程论坛 C语言论坛

c语言指针练习题答案看不懂几个地方,求大佬指点一下

aerobe 发布于 2020-11-10 21:36, 1745 次点击
题目是将一个不确定位数的正整数进行三位分节后输出
char *separate(long int);
char *exchange(long int);
int main()
{
    long int num;
    char *p;

    printf("please input a number\n");
    scanf("%ld",&num);
    p=separate(num);
    printf("结果是%s\n\n",p);
    system("PAUSE");
    return 0;
}

char *separate(long int num)
{

    char *p1,*p2=exchange(num),*p3,*pt;
    int count=1;

    p1=p2;
    while(*(p2++)!='\0');
    p3=p2-1;//第一个点就是这里
    p2=p2-2;

    while(p2>p1)
    {
        if(count==3)
        {
          pt=p3++;
          while(pt>=p2)
          {

              *(pt+1)=*pt;
              pt--;
          }
          *p2=',';
          count=1;
          p2--;
        }
        count++;
        p2--;
    }
    return p1;
}
char *exchange(long int num)
{
    char *p,*p1,*p2,temp;

    p=p1=p2=(char*)malloc(30*sizeof(char));
    while(num)
    {
        *p2=num%10+'0';
        p2++;
        num/=10;
    }
    *p2='\0';
    p2--;

    while(p2>p1)//第2个点是这里
    {
        temp=*p2;
        *p2=*p1;
        *p1=temp;
        p2--;
        p1++;
    }
    return p;
}
只有本站会员才能查看附件,请 登录
这里不明白,因为p1和p2都是指针,视频上说只有两个指针指向一个数组的时候才有大小比较意义,还有前面P3=p2-1,说是指向字符串结束标记,为什么?

[此贴子已经被作者于2020-11-10 21:56编辑过]

4 回复
#2
rjsp2020-11-11 09:38
程序代码:
#include <stdio.h>

void foo( unsigned n )
{
    unsigned b=1, c=1;
    for( unsigned t=n/10; t!=0; t/=10, b*=10, ++c );

    for( unsigned t=n; c!=0; t%=b, b/=10, --c )
    {
        putchar( t/b + '0' );

        if( c!=1 && c%3==1 )
            putchar( ',' );
    }
    putchar( '\n' );
}

int main( void )
{
    foo( 0 );
    foo( 1 );
    foo( 12 );
    foo( 123 );
    foo( 1234 );
    foo( 12345 );
    foo( 123456 );
    foo( 1234567 );
    foo( 12345678 );
    foo( 123456789 );
    foo( 1234567890 );
}


输出
程序代码:
0
1
12
123
1,234
12,345
123,456
1,234,567
12,345,678
123,456,789
1,234,567,890
#3
aerobe2020-11-11 12:51
回复 2楼 rjsp
非常感谢大佬的程序,但是我就是有一个疑问就是两个指针没有指向数组,却可以比较大小是为什么?
#4
纯蓝之刃2020-11-11 13:12
回复 3楼 aerobe
p=p1=p2=(char*)malloc(30*sizeof(char));

你p1、p2都指向了malloc分配的同一块内存空间,这块内存空间是连续的,所以p1、p2的比较是可以的,和数组的性质是一样的。char a[30];也是分配连续的长度为30*char长度的空间。
#5
aerobe2020-11-11 22:27
回复 4楼 纯蓝之刃
明白了,感谢感谢
1