0

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

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

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

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

请帮忙

非常感谢 !

4

5 回答 5

1

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

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

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

$ 选择一个数值> abr3
$

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

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

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

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

您必须添加对 input==0 的检查。

希望能帮助到你。

于 2010-05-09T05:28:44.837 回答
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;
}
于 2010-05-09T03:53:34.750 回答
0

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

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

于 2010-05-09T03:54:55.263 回答
0

如果问题是scanf忽略空格,请尝试getchar代替scanf.

于 2010-05-09T03:08:23.550 回答
0

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

于 2010-05-09T03:14:21.747 回答