我正在从用户那里获取字符串输入。但是我如何检查用户是否输入了字符串或数字?
答案 0 :(得分:7)
调用strtol,检查存储到endptr的值是否等于输入(成功转换),并且是指向NUL字节的指针(使用了整个字符串)。
http://www.opengroup.org/onlinepubs/000095399/functions/strtol.html
解释说如果你还想检测溢出,诀窍是将errno设置为0,然后调用strtol,然后检查errno是否仍为0.
如果你想要迂腐,你还必须使用isspace()检查输入字符串的第一个字符是非空格。原因是strtol和朋友跳过了初始空格,但也许你不认为“1”是有效数字。
如果你想允许更大的数字或非整数数字,替代方案分别包括strtoll和strtod。
答案 1 :(得分:2)
您可以检查它是否为数字:
char c;
scanf( "%c", &c );
if( isdigit(c) )
printf( "You entered the digit %c\n", c );
答案 2 :(得分:2)
int isNum;
if ((isNum = strtol(string, NULL, 10)))
printf(" '%d' numbers was found!\n", isNum);
else
{
printf("No number found");
}
转换读取的所有有效字符,如果字符串以无效字符开头,则函数返回ZERO(0)。
strtol() example 这显示了如何在数字之后打印出后面的字符或字符串中不是数字的部分。
或强>
int isNum
isNum = atoi(string);
答案 3 :(得分:2)
这里有很多好的启发式方法。
如果你想要密切定义输入,你可能想要编写自己的词法分析器/解析器来接受你所使用的语言,而不是尝试用标准库函数构建临时语言。
这本身就是一个重要的话题。请参阅“如何构建编译器”之一? StackOverflow上的参考问题......(例如Learning to write a compiler)。
答案 4 :(得分:1)
您可以使用atoi或atof,然后检查此函数返回的值是否不为0.这不是绝对可靠的,因为用户可能已输入“0”。
另一种方法是检查字符串中的每个字符是[0-9],+ / - 还是小数点,并拒绝每个不符合的字符串。
答案 5 :(得分:1)
您尚未指定预期的“数字”。根据有效的输入集,您可以调用许多标准库函数,就像其他人指定的那样。例如:如果您期望浮点数,则简单检查它是否为数字不起作用。另请注意,调用库函数是不够的,但您还需要检查返回值(即转换期间发生的错误)。
或者,您可以使用sscanf
功能检索数字。
最后,整数可以存储为int
或其变体(long
等)或浮点数。电话是你的。
答案 6 :(得分:0)
而不是使用像strtol,atoi,atof这样的函数。你可以定义自己的函数,它可以逐字符解析字符串并构建输出整数。如果在解析过程中如果一个字符是非数字,那么你可以安全地说出NaN中的字符串。或者您也可以使用isdigit()并检查每个字符,如果所有字符都是数字,则使用atoi将字符串转换为数字。