我有一个包含此代码的程序:
#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来扫描字符和帐户的空白,但这不起作用:(
请帮忙
非常感谢你!答案 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通常更适合读取机器编写的数据而不是交互式输入