isdigit()在C中的计算结果不是真的
我现在试了半个小时都没有成功。。。 它一定很简单,但我不知道我做错了什么:isdigit()在C中的计算结果不是真的,c,C,我现在试了半个小时都没有成功。。。 它一定很简单,但我不知道我做错了什么:isdigit()的计算结果不是true #include <stdio.h> #include <ctype.h> main() { int a = 2; if (isdigit(a)) { printf("\ncorrect\n"); } else { printf("\nnot correct\n"); }//end if }// end main 没有成功
isdigit()
的计算结果不是true
#include <stdio.h>
#include <ctype.h>
main()
{
int a = 2;
if (isdigit(a))
{
printf("\ncorrect\n");
}
else
{
printf("\nnot correct\n");
}//end if
}// end main
没有成功。。。
注意:它确实可以编译,我通过插入各种不同的打印语句来确保。您有
int
2。它不代表字符“2”2因为字符只是“文本开头”字符(不是数字) 你需要
isdigit('2')
isdigit()
指示参数的值是否表示ASCII数字;也就是说,它在48到57之间。参见参考图表
因此isdigit(2)
正确返回0,因为整数值2不在范围内
如果将代码更改为
isdigit('2')
,则会得到预期的结果,因为ASCII字符2
的值为50。您误解了isdigit
的用法
int a = '2';
isdigit(a);
如果您向它传递一个数字,比如说
isdigit(2)
,它将2
作为当前区域设置字符集中字符的代码(例如,ASCII代码2
是STX
,文本的开头,显然不是数字)。更改int a=2代码>到字符a='2'代码>或inta='2'代码>请参见卸下isdigit。
简单地写下:-
if((a))
printf("correct");
else
printf("wrong");
'2'
是一个int
too什么使ASCII值为2的字符“不可读”?这是一个控制字符,是的。。。但它仍然有一个符号,看起来像这样:☻代码>。这里唯一的事实是它不是一个数字。我相信控制字符通常不会显示。我看不出“文本开头”是怎么一个符号。@Paddy被更正为更精确的isdigit
,它的原型实际上是intisdigit(int)
。所有iswhater()
函数系列的原型都采用int
参数。使用时,您倾向于将char
隐式转换为int
,这是一个附带的事实。isdigit
将其参数解释为当前区域设置字符集中字符的代码,不一定是ASCII。@EricPostChil感谢您提供了更精确的解释。我更新并改进了我的答案。“isdigit()”用于ASCII字符,而不是二进制整数<代码>isdigit('2')==true
isdigit(2)=false
@palsm4isdigit()
适用于所有无符号字符
和EOF
。C11 7.4.1在所有情况下,参数均为int,其值应表示为无符号字符或等于宏EOF的值。如果参数有任何其他值,则行为是未定义的。我刚刚意识到这是一个多么糟糕的示例,但我得到了我想要的答案,现在理解了isdigit()
函数,thx to al@paulsm4:更具体地说,它用于确定指定的字符是否表示执行字符集中当前区域设置中的数字。不要将isdigit()
的结果与任何内容进行比较。如果参数是一个数字,它将返回一些任意的非零(即true)结果。直接使用它作为条件(正如您已经做的那样)。并确保参数要么在无符号字符
的范围内,要么等于EOF
(后者不是特别有用)。thx对于所有好的答案,我不得不在这里做出选择,接受众多答案中的一个…要找到你的问题的任何高质量答案,都是很难的选择。这不是我的第一选择。大多数答案都很好。我喜欢这个,因为它指出它可以是chara='2'代码>或inta='2'代码>使用scanf()时很方便
请注意,传递给isdigit()
宏(以及所有其他类型检查宏)的参数应为int
类型,并且该值应适合无符号字符
。还请注意,在某些系统上,char
可能是有符号类型。(字符文字是int
类型的正值)。这应该如何解决这个问题?我的代码片段只是一个符号,当然我不只是想测试变量是否有值。。。
if((a))
printf("correct");
else
printf("wrong");