【问题标题】:C code hanging at scanf() statementC 代码挂在 scanf() 语句处
【发布时间】:2012-12-02 04:25:12
【问题描述】:

我正在尝试将输入输入到数组中,直到用户输入 -1 以退出输入模式。

当输入 -1 但至少在输入了两个值之后,这段代码中发生了一些奇怪的事情。

#define ARRAYSIZE 100
int input[ARRAYSIZE];
int i=0;
do {
  printf("Enter data #%d or -1 to exit: ", i);
  scanf("%d", &input[i]);
} while(input[i++] != -1 && i<ARRAYSIZE)

代码将无限期挂起。我已经在两个独立的架构上编译和运行,但是在 gdb 中运行时问题没有出现。

插入打印语句显示代码确实挂在 scanf 语句处。

有人知道是什么原因造成的吗?

【问题讨论】:

  • 呃,你按“回车”后它还挂着吗? “input[]”是否声明为具有一个或多个“int”元素的整数数组?进入循环前“i”是否初始化为0?
  • 是的,谢谢你,我已经编辑了问题以明确说明
  • 什么是条目?为什么不把input[i++]!=-1 作为退出检查?
  • 为什么要彻底改代码?这个问题不再有意义。您现在拥有的代码不会表现出您描述的行为。请不要通过随机更改其孤立的部分来制造虚假和无意义的问题。
  • @Luke Walsh - 请将代码改回原来的损坏版本,使其成为其他人的学习工具

标签: c arrays loops scanf freeze


【解决方案1】:

你从来没有检查你保存的数据的值(它是检查下一个未初始化的元素),do while 更合适

#define ARRAYSIZE 100
int input[ARRAYSIZE],i=0;
do {printf("Enter data #%d or -1 to exit: ", i);
    scanf("%d", &input[i]);
}while(input[i] != -1 && ++i<ARRAYSIZE);
//if this is main() you need a return 0; here also or it will hang

【讨论】:

  • +1 你秒杀我.. 正要发布同样的逻辑。
  • @sansix 可能是因为我节省了忘记将 -ing 放在第二次检查中的时间 :)
【解决方案2】:

您的代码取决于未初始化数组元素的值。难怪它的行为不合理。

在您的while 循环条件下,您将input[i]-1 进行比较。在每次迭代中,input[i] 都没有被初始化——它包含一个垃圾值。由于垃圾值不太可能等于-1,因此您的循环不断运行,每次都在scanf 处停止以等待输入。这造成了“挂在scanf”的错觉,而实际上scanf 本身与真正的问题无关。

当然,这里真正的问题不是数组未初始化,而是您的循环条件检查了 错误 数组元素。您可能打算检查最近输入的元素。相反,您检查下一个元素。为什么?

我想说你的意图需要一个带有 post 条件的循环。

【讨论】:

    【解决方案3】:

    我的问题:

    3) 进入循环前“i”是否初始化为0?

    2) 是否将“input[]”声明为具有一个或多个“int”元素的整数数组?

    ...和...

    1) 你按“回车”后它仍然挂起吗?

    如果您还没有意识到这一点,您必须在 scanf() 处理任何输入之前点击“回车”。

    建议:

    #include <stdio.h>
    #define ARRAYSIZE 100
    
    int 
    main ()
    {
      int input[ARRAYSIZE];
      int i=0;
      int entry=0;
      while(entry != -1 && i<ARRAYSIZE) {
        printf("Enter data #%d or -1 to exit: ", i);
        scanf("%d", &input[i]);
        entry = input[i];
        fprintf (stderr, "entry= %d, input[i]= %d...\n", entry, input[i]);
        i++;
      }
      printf ("Done.\n");
      return 0;
    }
    

    注意“fprintf(stderr)”。

    样本输出:

    Enter data #0 or -1 to exit: 300
    entry= 300, input[i]= 300...
    Enter data #1 or -1 to exit: -1
    entry= -1, input[i]= -1...
    Done.
    

    再次 - 请说明您是否使用“Enter”键。如果是这样,请告诉我们您的平台(例如 Windows、Linux、MacOS 等)。

    '希望对您有所帮助...

    【讨论】:

      【解决方案4】:

      使用不同的变量来检查 -1。像这样的:

      #include <stdio.h>
      #define ARRAYSIZE 10
      
      int main(int argc, char **argv) {
          int data[ARRAYSIZE];
          int input = 0;
          int i = 0;     
      
          while(input != -1 && i < ARRAYSIZE) {
              scanf("%d", &input);
              data[i] = input;
              i++;
          }
      
          return 0;
      } 
      

      【讨论】:

        猜你喜欢
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多