【问题标题】:Program To Check If A Number Is Present In An Array检查数组中是否存在数字的程序
【发布时间】:2023-03-16 05:20:01
【问题描述】:

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

代码:

 #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 之前,但事实并非如此。


已解决

只需从scanf 中删除\n 即可修复。

【问题讨论】:

  • 您正在使用 scanf() 没有检查。更加偏执。阅读规范并寻找您没想到的东西。如果您发现了一些,请证明它们不会在您的情况下发生。
  • 对不起,我没有得到你的评论。该程序有效,唯一的事情是它首先接受输入,然后打印该行。你能指出为什么会这样吗?再次抱歉。
  • 好吧,两个赞成的答案都谈到了您对 scanf() 的使用。问题是您没有预料到的行为。我建议阅读规范并寻找你没想到的东西。您可能会发现这对未来的应用程序很有趣:sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html

标签: c arrays scanf


【解决方案1】:

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

使用...输入中所有可用的连续空白字符

(描述here

因此,当您输入最后一个数字5 时,系统现在会尝试使用所有空白字符。为此,它会等待额外的输入,直到它不是空格。因此,无论是否矛盾,为了消耗空间,系统必须读取一个非空间,这是您输入的第二个5

要解决此问题,您可以告诉系统只输入一个数字,而不使用空格:

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

但是,这会在缓冲区中留下空白,这可能会干扰以后的输入。要丢弃空格,您可以使用各种技术,例如描述here.

在我看来,最正确的技术(然而,也许是最神秘的技术)是

    scanf("%d%*[^\n]%*c",&arr[i]);
  • %d - 读取号码
  • %*[^\n] - 读取一个字符串,以换行字节结束;丢弃它,不要将其存放在任何地方
  • %*c - 读取一个字节(这是一个换行字节);丢弃它,不要将其存放在任何地方

顺便说一句,在您的格式字符串"%d \n" 中,有两个空格:一个常规空格和一个行尾。他们都告诉scanf 在输入中使用所有个空格。效果与一个空格"%d " 或一个行尾"%d\n" 完全相同,因此这个特殊的格式字符串可能会让阅读您的代码的人(包括您自己)高度混淆。

【讨论】:

    【解决方案2】:

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

    这会导致程序等待另一行。输入后,程序继续并询问要搜索的数字,此时输入已经输入。

    只需在scanf 中使用一个空格,它已经可以用于换行,最好是在数字本身之前,这样您就不需要额外的一行来完成操作:

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

    【讨论】:

    • 谢谢!为我清除了它。
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2014-10-25
    • 2011-06-20
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多