我想弄清楚这段代码出了什么问题。
我试着做一个C程序,只扫描不重复的数字,但它不工作很多次。这就是密码:

    #include<ctype.h>
    #include<string.h>

    int main (void)
    {
        //training for sorting tables
        int tab[100] , *p , n , bb=0 ;
        p=tab ;
        printf("enter how many numbers you want to type \n");
        scanf("%d",&n);
        printf("enter the numbers one by one okay");
        for(int i=0; i<n ; i++)
        {
            printf("number %d \n", i+1);
            scanf("%d",*(p+i));
            for(int x=0 ; x<= i ; x++)
            {
                if(*(p+x) == *(p+n))
                {
                    bb=1;
                }
            }
            if (bb == 1)
            {
                i-- ;
            }
        }

        for(int a=0 ; a<n ; a++)
            printf("%d \n", *(p+a));
    }

最佳答案

我不打算谈论算法,因为你不是这么问的。
我在这里看到两个主要问题。冷杉在这里:

scanf("%d",*(p+i));

scanf应获取参数的地址作为第二个参数。应该scanf("%d", p+i);
第二个问题是,您在bb循环中将for标志设置为1,但是您永远不会清除它
if (bb == 1)
{
    i--;
    bb = 0;
}

编辑
正如其他人在回答中提到的那样。你也需要改变
if(*(p+x) == *(p+n))


if(*(p+x) == *(p+i))

因为你想在当前输入的号码之前检查是否有重复。以及for循环中的停止条件
for(int x=0 ; x<= i ; x++)


for(int x=0 ; x<i ; x++)

因为当x==i时,您将获得true*(p+x) == *(p+i)
编辑:只是一个通知。
在下面的循环中(据我所知),您正在寻找相同的号码
for(int x=0 ; x<i ; x++)
 {
     if(*(p+x) == *(p+i))
     {
         bb=1;
     }
 }

因此,一旦找到它,就不需要迭代到最后。您可以使用break来中断内部循环:
for(int x=0 ; x<i ; x++)
 {
     if(*(p+x) == *(p+i))
     {
         bb=1;
         break;
     }
 }

或将bb==0条件添加到foor循环停止条件:
 for(int x=0 ; x<i && bb==0 ; x++)
 {
     if(*(p+x) == *(p+i))
     {
         bb=1;
     }
 }

此外,您完全可以去掉这个bb标志:
 int x;
 for(x=0 ; x<i && *(p+x)==*(p+i) ; x++);

然后就
 if (x < i)
 {
     i-- ;
 }

关于c - 选择正确的电话号码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34454243/

10-11 22:10
查看更多