2017-09-04 34 views
2

我编写了下面的C代码来检查一个数组是否存在于其元素由用户输入的数组中。但奇怪的是,它跳过了第三条printf声明,在输入后直接输入并打印Enter the number you wish to look for。这是什么造成的?包含代码下方的输入和输出框。程序检查数组是否出现在数组中[解决]

CODE

#include <stdio.h> 
#include <stdlib.h> 

    void main() { 
    int arr[30], size, i, num, flag=0; 

    printf("Enter size of array. \n"); 
    scanf("%d",&size); 

    printf("Enter %d array elements one by one. \n",size); 
    for (i=0; i<size; i++) { 
     scanf("%d \n",&arr[i]); 
    } 

    printf("Enter the number you wish to look for. \n"); 
    scanf("%d",&num); 

    for(i=0;i<size;i++) { 
     if (num == arr[i]) { 
      flag++; 
     } 
    } 

    if (flag>0) { 
     printf("The number %d is present in the array.",num); 
    } else { 
     printf("The number %d is not present in the array.",num); 
    } 
} 

输入/输出:

Enter size of array. 
5 
Enter 5 array elements one by one. 
1 
2 
3 
4 
5 
5 
Enter the number you wish to look for. 
The number 5 is present in the array. 

你可以看到,Enter the number you wish to look for.应该5前到来,但它并非如此。我相信这只是我失踪的一些愚蠢的事情。

对不起,任何错误,这是我第一次在这里问一个问题。

编辑:

如果里面的语句如下循环使用固定它。谢谢大家!

printf("Enter %d array elements one by one. \n",size); 
for (i=0; i<size; i++) { 
    if(arr[i] == arr[size-1]) { 
    scanf("%d",&arr[i]); 
    break; 
    } 
scanf("%d\n",&arr[i]); 
} 

编辑2:

阿呆我。只需通过删除\n进行修复。不需要if语句。再次感谢你!

+0

您正在使用的scanf ()而不检查。更偏执。阅读规范并寻找你没有想到的事情。如果你找到一些,证明它们不会在你的情况下发生。 – Yunnosch

+0

对不起,我没有收到你的评论。该程序起作用,唯一的是它首先输入输入,然后打印该行。你能指出为什么会发生这种情况吗?再次抱歉。 –

+0

这两个upvoted答案都谈论你使用scanf()。问题是你没有想到的行为。我建议阅读规范并寻找你没有想到的东西。您可能会发现这对未来的应用程序很有趣:http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html – Yunnosch

回答

2

输入格式字符串"%d \n"空间告诉输入系统

消费......从输入

(描述here)所有可用的连续的空格字符

所以当您输入最后一个号码5时,系统现在会尝试消耗所有空白字符。为此,它等待额外的输入,直到它不是空白。所以,反过来说,为了消费空间,系统必须读取非空间,这是您输入的第二个5

要解决这个问题,你可以告诉你的系统仅输入数字,无需耗费空白:

scanf("%d",&arr[i]); 

然而,这将留在缓冲区中的空白,这可能与后来输入干扰。为了丢弃空白,可以使用各种技术,例如, here

在我看来,最正确的方法(但是,也许最神秘的一个)是

scanf("%d%*[^\n]%*c",&arr[i]); 
  • %d - 阅读次数
  • %*[^\n] - 读一个字符串,通过一个换行符字节结束;丢弃它,不要将它存储在任何地方
  • %*c - 读取一个字节(这是一个换行字节);丢弃它并没有在你的格式字符串"%d \n" BTW存储任何地方

,有两个空格:有规律的空间,最终的行。他们都告诉scanf消耗所有输入空格。效果与一个空间"%d "或一行尾"%d\n"完全相同,因此这种特殊的格式字符串可能会使读取代码的人(包括您自己)感到非常困惑。

2

scanf中,空格字符已经表示任何空格。因此,在您的"%d \n"中,该功能已经在最后一位数字之后立即处理新行,但是您强制它等待另一个换行符。

这会导致程序等待另一行。输入后,程序继续并要求搜索号码,此时输入已经输入。

只需要使用scanf只有一个空间,它会为新行数字本身之前已经理想的工作,这样你就不需要一个额外的线来完成操作:

scanf(" %d", arr + i); 
+0

谢谢!为我清理它。 –