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

时间:2010-05-09 03:01:43

标签: c echo scanf

我有一个包含此代码的程序:

#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'作为第一个输入。 对于b和r,do循环下的代码重复。所以对于上面的例子,我得到:

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

有没有办法可以阻止这个?我尝试使用\ n%c来扫描字符和帐户的空白,但这不起作用:(

请帮忙

非常感谢你!

5 个答案:

答案 0 :(得分:1)

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

  

选择数值
  选择数值&gt;
  选择数值
  3

现在你不会出现这些“过度”Choose a numeric value的内容。如果用户输入了abr3,它只需从中取3并退出。这样的事情。

  

$选择数值&gt; abr3
  $

现在要做到这一点,你必须在scanf()语句中更改格式说明符。试试你的程序

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

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

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

您必须添加输入检查== 0。

希望它有所帮助。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

为什么不将printf("Choose a numeric value"); 移到<{1}} / do循环之前(就在之前)?如果它在循环内部,它将在循环的每一段执行,如果它在外面它将在循环之前只执行一次。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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