iscntrl 的行为是什么?

What is the behavior of iscntrl?

函数iscntrl已标准化。不幸的是,在 C99 上我们有:

The iscntrl function tests for any control character

考虑到 int iscntrl(int c); 的原型,我希望 0..31 和 127 也能得到类似 true 的东西。但是在以下内容中:

#include <stdio.h>
#include <ctype.h>
int main()
{
    int i;
    printf("The ASCII value of all control characters are ");
    for (i=0; i<=1024; ++i)
    {
        if (iscntrl(i)!=0)
            printf("%d ", i);
    }
    return 0;
}

我得到这个输出:

The ASCII value of all control characters are 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 264 288 308 310 320 334 
336 346 348 372 374 390 398 404 406 412 420 428 436 444 452 458 460 466 468 474 
476 484 492 500 506 512 518 530 536 542 638 644 656 662 668 682 688 694 700 706 
708 714 716 718 760 774 780 782 788 798 826 834 836 846 854 856 864 866 874 876 
882 888 890 892 898 900 908 962 968 970 988 994 1000

所以我想知道这个功能是如何在幕后实现的。我试图在标准库上搜索,但答案并不明显。

https://github.com/bminor/glibc/search?q=iscntrl&unscoped_q=iscntrl

有什么想法吗?

您通过将不正确的值传递给 iscntrl() 来调用未定义的行为。

根据 7.4 Character handling <ctype.h>, paragraph 1:

The header <ctype.h> declares several functions useful for classifying and mapping characters. In all cases the argument is an int, the value of which shall be representable as an unsigned char or shall equal the value of the macro EOF. If the argument has any other value, the behavior is undefined.