我想弄清楚这段代码出了什么问题。
我试着做一个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/