gpt4 book ai didi

c - 数组下标的类型为 'char'

转载 作者:太空狗 更新时间:2023-10-29 15:59:20 29 4
gpt4 key购买 nike

我有以下代码从命令行读取参数。如果字符串长度为 1 个字符和一个数字,我想将其用作退出值。编译器在第二行给我一个警告(数组下标的类型为 'char' )这个错误来自 "&&"之后的第二部分。

    if (args[1] != NULL) {
if ((strlen(args[1]) == 1) && isdigit(*args[1]))
exit(((int) args[1][0]));
else
exit(0);
}
}

此外,当我使用不同的编译器时,我在下一行(退出)出现两个错误。

builtin.c: In function 'builtin_command':
builtin.c:55: warning: implicit declaration of function 'exit'
builtin.c:55: warning: incompatible implicit declaration of built-in function 'exit'

最佳答案

问题是 isdigit()宏接受一个整数参数,它是值 EOF 或 unsigned char 的值。 .

ISO/IEC 9899:1999(C 标准 – 旧),§7.4 字符处理 <ctype.h> , ¶1:

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.

在您的平台上,char是有符号的,因此如果您的字符在 0x80..0xFF 范围内,它将被视为负整数。 isdigit()的通常执行宏是使用参数来索引标志位数组。因此,如果您传递 char从 0x80..0xFF 范围开始,您将在数组开始之前进行索引,从而导致未定义的行为。

#define isdigit(x)  (_CharType[(x)+1]&_Digit)

您可以安全地使用isdigit()两种方式之一:

int c = getchar();

if (isdigit(c))
...

或:

if (isdigit((unsigned char)*args[1]))
...

在后一种情况下,您知道该值不会是 EOF。请注意,这是不行的:

int c = *args[1];

if (isdigit(c)) // Undefined behaviour if *args[1] in range 0x80..0xFF
...

有关“函数退出的隐式定义”的警告意味着您没有包含 <stdlib.h>但你应该这样做。

您可能还会注意到,如果用户给您一个 2 作为第一个参数的第一个字符,则退出状态将为 50,而不是 2,因为 '2'是(通常,在 ASCII、UTF-8 和 8859-1 等中)字符代码 50('0' 是 48,等等)。你会得到 2 (无引号)通过使用 *args[1] - '0'作为 exit() 的参数.您不需要对该表达式进行强制转换,尽管它不会造成太大伤害。

关于c - 数组下标的类型为 'char',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10186219/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com