ctype函数(isalpha,isdigit)在c ++

时间:2018-01-03 05:24:17

标签: c++

这是我的程序的测试代码:

#include <iostream>
#include "ctype.h"
using std::cout;

int main(){
    cout << "Welcome to the program: ";
    cout << "\n" << "Let's see if the value of \'x\' is digital: ";
    int x = 5;
    cout << isdigit(x);

    cout << "\n" << "Let's see if the value of \'i\' is alphabetical: ";
    char i = 'i';
    cout << isalpha(i);

    return 0;
}

结果:

  

欢迎来到该计划:

     

让我们看看'x'的值是否为数字:0

     

让我们看看'i'的值是否按字母顺序排列:2

两个值都是2或0,而它们都是真的吗? 不应该只是结果中显示的0或1值? 注意:我没有在全局变量部分使用'enum'或'#define'更改值。

2 个答案:

答案 0 :(得分:6)

isXXX()函数将返回表示true或false值的整数。假设零是假的,而其他任何东西都是真的,那么两个是完全可接受的返回值。

您为isdigit(5)获取错误值的原因是因为该函数采用字符并告诉您它是否为数字。虽然'5'可能是数字字符,但5很可能不是。

C ++遵循这些函数的C,因为它们是cctype标题的一部分。标准的相关部分(C99 7.4)指出:

  

标题<ctype.h>声明了几个对字符分类和映射有用的函数。在所有情况下,参数都是int,其值应表示为无符号字符或等于宏EOF的值。

     

当且仅当参数c的值符合函数描述中的值时,本子句中的函数才返回非零(true)。

通常,在C和C ++ C-legacy函数(a)中,您永远不应该将真值与固定的真/假值进行比较。因为它将零视为假,其他一切都是真的,正确的方法就是:

cout << "It " << (isdigit(x) ? "is" : "isn't") << " a digit";

(a)这通常是一个很好的规则,即使对于 为真的C ++ bool比较(和其他语言),假的。

如果布尔值或函数被正确命名(并且应该),那么正确的方法是:

if (! errorOccurred) ...
if (isComplete) ...
if (isdigit(myChar)) ...

那是因为,使用 reductio ad absurdum ,表达式boolVal == TRUE只是另一个布尔值,所以你在哪里停止?

if (isComplete == TRUE) ...
if ((isComplete == TRUE) == TRUE) ...
if (((isComplete == TRUE) == TRUE) == TRUE) ...
if ((((isComplete == TRUE) == TRUE) == TRUE) == TRUE)...

依此类推, ad infinitum

答案 1 :(得分:2)

不,isalphaisdigit不返回布尔值,也不需要返回1。如果谓词满足,则指定它们返回非零值,否则返回零。