代码之家  ›  专栏  ›  技术社区  ›  NLed

每次扫描字符时程序都会重复。。如何阻止它?

  •  0
  • NLed  · 技术社区  · 16 年前

    我有一个程序有以下代码:

    #include<stdio.h>
    main(){
      int input;
      char g;
    
      do{
        printf("Choose a numeric value");
        printf(">");
        scanf("\n%c",&input);
        g=input-'0';
       }while((g>=-16 && g<=-1)||(g>=10 && g<=42)||(g>=43 && g<=79));
    
    }
    

    abr39293afakvmienb23
    

    程序忽略:a,b,r。。但将“3”作为第一个输入。 对于b和r,do循环下的代码重复。对于上面的例子,我得到:

    Choose a numeric value
    >Choose a numeric value>
    Choose a numeric value
    >3
    

    请帮忙

    非常感谢你!

    5 回复  |  直到 16 年前
        1
  •  1
  •   Andrew-Dufresne    16 年前

    我从你的问题中了解到当用户进入 abr3

    选择一个数值
    选择一个数值>

    现在你不知道这些“过分” Choose a numeric value

    $选择一个数值>阿布3
    $

    现在要做到这一点,您必须更改 scanf() 声明。尝试您的程序

    input = 0 ;
    scanf( "%[0-9]" , &input );
    

    它告诉scanf接受大括号内的所有内容,即0-9。此范围之外的任何其他字符都将被忽略。如果用户输入 ,a不在范围内,因此输入将保持等于零。此外, 选择一个数值 对于a,b和r不会出现。

    如果用户输入是0-9范围内的数字,则接受并输入。

    您必须为input==0添加一个检查。

        2
  •  0
  •   Messa    16 年前

    如果问题是 scanf 忽略空白,再试一次 getchar 而不是 .

        3
  •  0
  •   Alex Martelli    16 年前

    printf("Choose a numeric value"); (就在)前 do while

        4
  •  0
  •   Boris    16 年前

    试着用下面的例子,不要忘记释放内存。

    #include <stdio.h>
    
    int main()
    {
      int size = 100;
      char *line;
      int number;
    
      while (1) {
        puts("Enter number");
        line = (char *) malloc((sizeof(char) * size) + 1);
        getline(&line, &size, stdin);
    
        if (sscanf(line, "%d", &number) != 1) {
          puts ("\nInvalid input");
        } else {
          break;
        }
      }
    
      printf ("\nInput number\n%d\n", number);
    
      return 0;
    }
    
        5
  •  0
  •   Chris Dodd    16 年前

    Choose a numeric value> 然后等待一行输入。然后它沿着输入扫描,打印 Choose a numerical value> 对于每个可打印字符,直到它到达一个数字或控制字符,然后停止。如果没有数字或控制字符,它读取另一行a重复。