【问题标题】:Program repeats each time a character is scanned .. How to stop it?每次扫描一个字符时程序都会重复..如何停止它?
【发布时间】:2010-05-09 03:01:43
【问题描述】:

我有一个程序有这个代码:

#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));

}

它基本上使用 ASCII 操作来允许程序仅接受数字 .. '0' 默认值为 48...ASCII 值 - 48 给出了上述数字范围(在 while 语句中)

无论如何,只要用户输入数字和字母,例如:

abr39293afakvmienb23

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

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

有什么办法可以阻止这个吗???我尝试使用 \n%c 来扫描字符并考虑空格,但这不起作用:(

请帮忙

非常感谢!

【问题讨论】:

标签: c echo scanf


【解决方案1】:

我从你的问题中了解到,当用户输入abr3 时,你得到的输出是

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

现在你不要什么这些“过分”的Choose a numeric value来出现。如果用户输入了 abr3,它只需从中取 3 并退出。像这样。

$ 选择一个数值> abr3
$

现在,您必须更改 scanf() 语句中的格式说明符。用

试试你的程序
input = 0 ;
scanf( "%[0-9]" , &input );

它告诉 scanf 接受大括号内的所有内容,即 0-9。此范围之外的任何其他字符都将被忽略。如果用户输入abr3,a 不在范围内,因此输入将保持为零。此外,a、b 和 r 的 Choose a numeric value 不会出现。

如果用户输入的是 0-9 范围内的数字,它将被接受并放入输入中。

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

    如果问题是scanf 忽略空格,请尝试getchar 而不是scanf

    【讨论】:

      【解决方案3】:

      为什么不把printf("Choose a numeric value"); 移出(就在之前)do/while 循环?如果它在循环内,它将在循环的每一段执行,如果它在循环外,它将只在循环之前执行一次。

      【讨论】:

      • 但是用户可以输入无限数量的字母,程序只是等待一个数字......它不会表明用户犯了错误。
      • 是的,它会的。你仍然有那条消息,它只是被移动到只显示一次。
      【解决方案4】:

      尝试使用下面的示例,不要忘记释放内存。

      #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】:

        您的程序打印Choose a numeric value&gt;,然后等待一行输入。然后它沿着输入扫描,为每个可打印字符打印Choose a numerical value&gt;,直到它到达一个数字或控制字符,然后停止。如果没有数字或控制字符,则读取另一行 a 重复。

        如果这不是您希望程序执行的操作,则需要对其进行更改,但为了有机会获得真正的帮助,您需要说出您希望程序执行的操作。从提示字符串中,您似乎想读取一个数字,但如果输入不是数字,您想做什么?只有一个数字,还是多个数字?如果数字后面跟着一些垃圾怎么办?根据您的需要,使用 fgets 读取一行,然后解析它(使用 sscanf 或 atoi)可能更有意义,因为您可以更轻松地提供有关格式错误的输入的合理错误消息。使用 scanf 通常更适合读取机器写入的数据而不是交互式输入

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-15
          • 1970-01-01
          相关资源
          最近更新 更多