选择正确的号码

时间:2015-12-24 14:26:59

标签: c arrays pointers

我试图找出这段代码的错误。

我尝试制作一个只扫描没有重复数字的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));
    }

3 个答案:

答案 0 :(得分:2)

错误在于:

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

应该是:

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

当您扫描整数时,参数应该是要存储的整数变量的地址。您通过地址间接传递整数本身的值(它尚未初始化) )。

答案 1 :(得分:1)

您正在比较*(p + x)和*(p + n)。我相信你的意思是比较*(p + x)和*(p + i)。而且你真的应该把它们写成p [x]和p [i],甚至是tab [x]和tab [i],因为p似乎没有目的。

答案 2 :(得分:1)

我不打算谈论算法,因为那不是你提出的问题。

我在这里看到2个主要问题。冷杉在这里:

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-- ; } 标记:

jobs_

然后只是

job_