【问题标题】:C Ending a loop with user inputC 用用户输入结束循环
【发布时间】:2015-06-07 01:01:14
【问题描述】:

我正在尝试编写一个程序,该程序允许用户将整数值插入到数组中,直到他们输入要停止的特定键,例如 ENTERX

int array_numb[100];
char quit = 'x';
printf("Enter as many values into the array as you want, pressing x will end the loop\n");
while(1==1){
    int i = 0;
    scanf("%i",&array_numb[i]);
    i++;
    array_numb[i] = quit;
}

我知道这是错误的,但这是我的思考过程。有任何想法吗?感谢您的帮助

【问题讨论】:

    标签: c arrays input while-loop scanf


    【解决方案1】:
    1. Enter as many values into the array as you want 虽然拥有int array_numb[100];,但在某些时候你会遇到麻烦。如果用户在输入sentinel value 之前输入了超过 100 个数字怎么办?你会超出分配的内存,不是吗?

    2. 您应该检查scanf() 的返回值以确保正确输入。提供的格式说明符和输入类型不匹配将导致scanf() 失败。详情请查看man page

    3. 您需要在while(1) 循环内有一个break 语句才能中断。否则,您需要在while() 循环的控制表达式中有条件语句来终止循环。

    注意:恕我直言,停止扫描用户输入的最佳方法是将scanf() 的返回值与EOF 进行比较,可以通过按CTRL+D 在 linux 和 CTRL+Z 在 Windows。

    您可以查看this answer 以供参考。

    【讨论】:

      【解决方案2】:

      同样的事情可以实现如下所示: scanf() 可能会失败并检查返回值。扫描字符时 scanf() 失败

      int i=0;
      printf("Enter as many values into the array as you want, pressing x will end the loop\n");
      while(i<100 && scanf("%d",&array_numb[i])==1)
      {
         i++;
      }
      

      【讨论】:

      • 好的,我对 C 和编程还很陌生,所以如果您可以进一步扩展您的逻辑,我对将 scanf 语句与 1 进行比较感到困惑。所以因为它是 %d ,并且一个字符值被输入到一个整数数组中它是假的吗?所以现在 == 0?
      • 此解决方案部分正确,因为输入 any 字符会中断循环。
      • @CoolGuy 是的!我认为 OP 想要将值扫描到数组中,而不是需要将什么字符用作哨兵条件
      • 是的,我非常感谢 Gopi 的回答,它给了我很多洞察力
      【解决方案3】:

      scanf%i 将在无效数据(例如插入字符)时扫描数字失败,如果失败则返回 0(在您的情况下)。

      只需检查scanf 的返回值。如果为零,请使用

      if(getchar()=='x') //or if(getchar()==quit)
        break;
      

      注意:使用

      清除/刷新标准输入流(stdin
      int c;
      while((c=getchar())!='\n' && c!=EOF);
      

      在循环之后以及break; 之后。

      【讨论】:

      • 您能否详细说明刷新标准输入流的作用?我熟悉 getchar() 但对它实际检查的内容不太自信。谢谢你的回答!
      【解决方案4】:

      你可以学习一些东西并使用信号: http://man7.org/linux/man-pages/man7/signal.7.html

      注册 SIGINT,覆盖它,让它检查哪个键被按下,然后让它改变一个变量。在你的循环中检查这个变量是 0 还是 1。

      信号具有最高优先级,无论循环如何都会执行信号代码。 示例:http://www.thegeekstuff.com/2012/03/catch-signals-sample-c-code/

      对于这种情况来说,这有点矫枉过正,但知道一件有趣的事情。信号是操作系统管理事件的方式,例如进程终止、键盘输入等。请注意,如何使用它是操作系统特定的,与 C 本身没有太大关系。

      【讨论】:

        猜你喜欢
        • 2015-05-30
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多