TerenceL 发表于 2023-2-3 01:02:38

写C程序时遇到用指针访问数组的问题

代码目的是实现输入一个数,把它的每个数位标记到数组里,想问问大家代码有什么问题呀(用在51单片机上的,不知道是不是这段代码出了问题)麻烦了!int Pow(int a, int b)
{
        int c = a;
       
        if(b==0)
        {
                a = 1;
        }
        while(b)
        {
                a = a * c;
                b--;
        }

        return a;
}

int* counter(unsigned long int count)
{
        unsigned long int a;//a从0开始+1直到==count,从而计算count每一位上的数字
        int number, b, dight = 7;//b作临时计数变量,计算每一位的大小并赋值给数组
       
        while(dight+1)
        {
                for(a=Pow(10,dight+1),b=1;a=a-Pow(10,dight),b++;a>=0)
                {
                        if(a < count)
                        {
                                count -= a;
                                number = (10 - b);
                                break;
                        }
                }
                dight--;
        }
       
        return number;
}

void main()
{       
        bit flag = 1;
        int checker, timer, num;//timer储存counter中的数组,num临时计数
        int *pa = counter(20);//pa储存数组地址
        for(num=0;num++,pa+=4;num<=7)
        {
                timer = *pa;
       
        }
       
        for(num=0;num++;num<=7)
        {
                if(timer == 0 && flag == 1)
                {
                        checker = num;
                        flag = 0;
                }
                if(timer != 0 && flag == 0)
                {
                        flag = 1;
                }
        }
}

桃花飞舞 发表于 2023-2-3 01:24:06

本帖最后由 桃花飞舞 于 2023-2-3 01:31 编辑

你的代码不行吧!
为什么for循环这么写


for(num=0;num++,pa+=4;num<=7)//这里有pa++不行么?   而且for循环这么写不对吧改为 for(num=0;num<=7;num++,pa++;)
for(num=0;num++;num<=7)          //for循环这么写不对改为for(num=0;num<=7;num++)   
int* counter(unsigned long int count)函数里
int number, b, dight = 7;//b作临时计数变量,计算每一位的大小并赋值给数组   
上句这句改为
int *number = malloc(8*sizeof(int));
int b = 0,dight = 7;
return number; //这样返回局部数组的地址是不正确的 具体可以把函数int* counter(unsigned long int count) 做成int* counter(int * number,int n ,unsigned long int count) ,
这样就可以返回 number,你这里的用法还不太会。
或者用上面malloc的方法来写

细节多多少少还有问题,慢慢改吧,你的程序没有给出输入输出样例,我也不好给你改错



jhq999 发表于 2023-2-3 07:51:06

int Pow(int a, int b)
{
    if(b==0)
    {
      return 1;
    }
    b-=1;
    int c = a;
    while(b)
    {
      a = a * c;
      b--;
    }

    return a;
}

两手空空儿 发表于 2023-2-3 11:32:57

本帖最后由 两手空空儿 于 2023-2-3 11:43 编辑

你要先把楼上兄弟们说的错误改正
我说点逻辑上的,我没看懂的的想法。。。。。。。
int* counter(unsigned long int count)
{
      unsigned long int a;//a从0开始+1直到==count,从而计算count每一位上的数字
            //这里注释a是从0开始
      int number, b, dight = 7;//b作临时计数变量,计算每一位的大小并赋值给数组
      
      while(dight+1)
      {
                for(a=Pow(10,dight+1),b=1;a=a-Pow(10,dight),b++;a>=0)
                            //这里a是从10^8开始 ,,,第二次循环a= a- 10^6,丢了7啊
                            //假如补上7,第一次a=10^8, 第二次 a= 10^8 - 10^7 = 10, 这不合理,怎么拿到每一位的数字?
                {
                        if(a < count)
                        {// 这一段我没看明白 参数count = 20传进来, 当a=10时进入这里
                              count -= a;   // count = 10
                              number = (10 - b);    // 10 -循环次数(b) ,这是想记录什么??????
                              break;   //想遍历这里应该是用 continue,要不if只进一次就结束while循环了
                        }
                }
                dight--;
      }
      
      return number;
}
还有第45行for(num=0;num++,pa+=4;num<=7)
这里可能也有问题, C51是8位机,要确认一下你的环境int是不是4个字节 ,要不pa += 4 一下就超了, 没有必要手动,已经定义了pa 是int 型, 直接p++就是下一个int的位置了
//一般我们提取各个位上的数字是用求余的方式
int count = 56214;//待分析数字
int dig;//存放拿到的一位数字
for( ; count > 0; count /= 10)
{    //从个位开始拿到每一位数字
             dig = count % 10;
             printf("%d\n", dig);
}
// 这一段会输出
// 4
// 1
// 2
// 6
// 5
页: [1]
查看完整版本: 写C程序时遇到用指针访问数组的问题