gpt4 book ai didi

c - C 中的枚举/类似字典的工具?

转载 作者:行者123 更新时间:2023-12-02 00:11:08 25 4
gpt4 key购买 nike

我正在阅读 K&R 第 7 章中问题的解决方案 here .基本上,程序会根据程序名称(“upper”或“lower”)将标准输入转换为小写或大写。它似乎将转换函数的名称存储在某种字典中,如下所示:

int (*convcase[2])(int) = {toupper, tolower};

然后根据程序名称是以 u 还是以 l 开头来访问这些函数:

if(argc > 0)
{
if(toupper((unsigned char)argv[0][0]) == 'U')
{
func = 0;
}
else
{
func = 1;
}

while((ch = getchar()) != EOF)
{
ch = (*convcase[func])((unsigned char)ch);
putchar(ch);
}
}

我明白那个代码块在做什么,但我从来没有见过像 convcase 的初始声明那样的东西。它看起来像是宏、枚举和数组的某种奇怪组合。谁能解释一下(1)为什么 convcase 是一个指针; (2) 名字后面的 (int) 是什么意思; (3) 该声明中的 toupper 和 tolower 到底是什么,因为它们不是 char *s; (4) 何时/为何使用这种设置。当您有多个可能的函数调用时,它只是一个类似宏的快速工具来节省一些空间吗?

最佳答案

  1. convcase 是两个函数指针的数组;它不是指针。当在需要指针的地方使用数组表达式时,它会被隐式转换为指针。
  2. 那不是类型转换。它指定函数接受 int 参数,就像 touppertolower 函数一样。
  3. convcase 使用函数指针 touppertolower 初始化。
  4. 我想这个问题是关于函数指针的。当您希望对函数指针进行抽象时,请使用函数指针。我建议这个例子是对函数指针的不必要使用。根据用户输入将 convcase[0]convcase[1] 更改为西类牙语或日语的能力更有可能保证在这种情况下使用函数指针。此外,可以在参数中使用函数指针来提供额外的抽象。例如,qsort函数能够对任何类型的数组进行排序,因为它使用对象的比较器 函数指针。下面是一个使用 int_compare 函数作为比较器int 输入进行排序的示例。
#define nelem(array) (sizeof (array) / sizeof *(array))

int int_compare(const void *p1, const void *p2) {
int x = *(int *)p1, y = *(int *)p2;
return (x > y) - (y > x);
}

int main(void) {
int value[16];
for (size_t x = 0; x < nelem(value); x++) {
if (scanf("%d", &value[x]) != 1) {
break;
}
}

qsort(value, sizeof *value, x, int_compare);
return 0;
}

关于c - C 中的枚举/类似字典的工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15325436/

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