- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下代码从命令行读取参数。如果字符串长度为 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 anunsigned 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/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
当我尝试运行以下代码时,List(.of) 无法编译并给出主题错误。 package collections; import java.util.LinkedHashSet; import java.
我正在尝试编译使用 ChatScript 库的程序。这是我在名为 main.cpp 的文件中的代码: #include #include "common.h" using namespace std
我想在我的程序中外部使用 ChatScript。在documents它说: Embedding Step #1 First, you will need to modify `common.h and
假设我有一个 char,我想用一行代码将其 strcat() 转换为 char 数组。对于 [一个非实用的] 示例: strcat("ljsdflusdfg",getchar()); 或者我想做相反的
我有以下类型签名: *Main Lib> let f :: a -> a -> a -> a; f = undefined *Main Lib> let x :: Char; x = undefin
我正在学习如何在 C 中使用指针(使用 malloc 和 free),但我在这个练习中遇到了一些麻烦。我只想制作一个指针数组,我想在其中保存每个单词的方向。然后我想为一个特定的词做一个 free(),
我有一个字符*: char* version = "10.5.108"; 我想通过字符分隔符获取两个新的 char*。 char delimiter = '.'; 执行以下代码后: printf("|
最近在学习Cpp,今天在学习使用Clion做测试的时候,发生了奇怪的事情。 这是我的代码 int main() { char c = 'b'; char carr[1]{'a'};
我对 c 很陌生,我正在审查一些代码。我遇到了这个: static char * fromDataType; static char * toDataType; static char * fromR
我有一个像这样的动态结构: struct network { int count; char** ips; } 如果我知道每个字符串数组都是 16 个字节(即 INET_ADDRSTR
我有一个旧程序,其中使用了一些库函数,但我没有那个库。 所以我正在使用 C++ 库编写该程序。在那个旧代码中有一些函数是这样调用的 *string = newstrdup("这里有一些字符串"); 字
我正在编写一个函数,该函数接受 ArrayList,然后将每个 char[] 复制到另一个增加长度的 char[] 中,然后将新的 char[] 添加到新的 ArrayList 中。当我尝试复制数组时
我正在寻找 map >并生成每个可能的 map从它。 我知道这可能会占用大量内存并需要一些时间。 每个map需要包含每个字母 a-z,并映射到唯一的 a-z 字符。 IE。啊bjcp迪EVfh嘎血红蛋
#define NAME_LEN 20 #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma warning(disab
所以我必须创建一个函数来找到一对带有第一个字母并返回第二个字母的函数。 我实际上找到了一个答案,但是使用 map 功能却找不到。 lookUp :: Char -> [(Char, Cha
我最近接受采访并要求写mystrcat(*s1, *s2, *s3) 其中s1 和s2 是源字符串连接结果由 s3 给出。有人告诉我,不要担心 s3 的内存分配,并假设 s1 和 s2 不是空/无效字
今天我与一位同事讨论了他(对我来说)不寻常的“main”函数签名。他喜欢这样声明: int main(int argc, char* (*argv)[]) { printf("at index
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: What's the difference between new char[10] and new cha
通常字符串文字是 const char[] 类型。但是当我把它当作其他类型时,我得到了奇怪的结果。 unsigned char *a = "\355\1\23"; 使用此编译器会抛出警告“初始化中的指
我是一名优秀的程序员,十分优秀!