嗨,我是 c 新手,我正在编写一个程序,要求用户输入一个整数,如果它不符合一定范围内的标准,比如小于 20,但大于 5。它询问用户再次输入值。
但是我想知道如果我输入一个字符会发生什么,并且它会创建一个无限循环。
所以我想知道是否有一种方法或一个特定的函数可以检查输入的值,看看它是否是正确的数据类型。而且我不会提醒用户。
嗨,我是 c 新手,我正在编写一个程序,要求用户输入一个整数,如果它不符合一定范围内的标准,比如小于 20,但大于 5。它询问用户再次输入值。
但是我想知道如果我输入一个字符会发生什么,并且它会创建一个无限循环。
所以我想知道是否有一种方法或一个特定的函数可以检查输入的值,看看它是否是正确的数据类型。而且我不会提醒用户。
许多人已经尝试过,但到目前为止,在制造能够控制用户大脑以防止用户有时按下错误(某种)按钮的计算机方面还没有取得任何成功......;)
有两种普遍接受的解决方案来解决这个问题:
编写一个直接输入函数,读取“无回显”,并丢弃[可能显示一些消息]错误输入,以及“知道”什么是有效输入的特定输入函数。
使用标准函数将输入读取为文本字符串,然后(尝试)将字符串输入转换/验证为数字或其他内容。在这里,如果转换/验证失败,您会打印一些消息并要求用户重试。
为了应对这种可能性,您必须将输入扫描为文本,然后自行进行健全性测试。
您可以阅读,scanf("%d")
如果用户输入一个包含非数字字符的字符串,那么您必须在再次阅读之前清理标准输入缓冲区scanf("%d")
。
当你清理标准输入时,你将停止无限循环
使用以下功能清理您的标准输入
int clean_stdin()
{
while (getchar()!='\n');
return 1;
}
并且可以通过这种方式从标准输入读取整数:
char c;
do
{
printf("\nEnter an integer from 5 to 20: ");
} while (((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin()) || rows<5 || rows>20);
一种常见的方法是将输入读取为文本,然后使用类似strtol
or的库函数转换为目标类型strtod
。这两个功能还允许您检测错误输入。
这是一种方法:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char instr[12];
int value;
char *chk;
/**
* Make sure read is successful
*/
errno = 0;
if (!fgets(instr, sizeof instr, stdin))
{
perror("Unable to read input string");
exit(-1);
}
/**
* Make sure user didn't enter more characters
* than we're prepared to handle.
*/
if (!strchr(instr,'\n'))
{
fprintf(stderr, "Input too long for buffer, discarding...\n");
while (!strchr(instr,'\n'))
fgets(instr, sizeof instr, stdin);
exit(-1);
}
else
{
*strchr(instr,'\n') = 0;
}
/**
* Convert text to decimal integer using strtol
*/
value = (int) strtol(instr, &chk, 10);
if (!isspace(*chk) && *chk != 0)
{
fprintf(stderr, "%s\n", instr);
fprintf(stderr, "%*s^\n", (int)(chk - instr), " ");
fprintf(stderr, "Invalid character detected in input string\n");
exit(-1);
}
printf("Converted input value is %d\n", value);
return 0;
}
因此,假设您没有读取错误并且用户没有输入令人讨厌的长输入,您可以使用strtod
将文本字符串转换为相应的整数值。 chk
将被设置为指向不属于有效整数常量的第一个字符。如果该字符不是空白字符 ( isspace(*chk)
) 或 0 终止符,则输入不是有效的整数字符串。然后你可以把它扔掉并要求一个新的输入。
C中的标头中有一些函数<ctype.h>
..
isalpha()
用于检查输入的输入是否为字母表。
您可以在字符串中输入并检查每个字符是字母还是数字..将其保持在循环中以检查它,如果给定的输入无效,则要求用户重新输入..
isdigit()
用于检查给定输入是否为数字..
int is_alpha(char *s)
{
while(*s) {
if(isalpha(*s))
s++;
else
return 0;
}
return 1;
}
上面的函数检查输入的输入是否都是字母。如果条件失败,我返回“0”,如果条件为假,则返回“1”。
在 main 函数中收集返回值并检查..
确实存在可以检查输入的数字是整数还是输入的字符实际上在 az 之间的函数。
但是没有可以为特定范围设置的功能,您必须自己设计。一个简单的函数可以像
int check(int a)
{
if(a>5 && a<20)
{
printf("Need a different Value");
}
}