gpt4 book ai didi

c - 上层函数

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:55 25 4
gpt4 key购买 nike

我想知道 C 中的 toupper() 函数是如何工作的。我正在下面的代码中尝试,但我肯定做错了什么。代码可以编译,但是传递给 toupper() 的参数没有被大写...

char **copyArgs(int argc, char **argv) {
char **a = malloc(sizeof(char *) * (argc));

int i;
for(i = 0; i < argc; i++) {
int size = strlen(argv[i]);
a[i] = malloc(sizeof(char) * (size + 1));
strcpy(a[i], argv[i]);
a[i] = toupper(a[i]);
}
return a;
}

如果我用“一二”测试它,结果是“一二”,而不是“一二”。任何建议表示赞赏。

最佳答案

toupper 将单个字母转换为大写。在你的例子中,由于 C 在隐式转换中的宽恕,你正在传递一个指向它而不是 char 的指针,所以很明显它不能正常工作。可能您会收到“没有转换的隐式整数转换指针”警告:这是一个强烈的信号,表明您正在做一些非常错误的事情。

整个事情并没有因为在您的平台上 int 和指针一样大(或者至少对于您正在使用的那些指针足够大)而爆炸; toupper 尝试将 int 解释为一个字符,发现它不是字母并返回它未修改。这是纯粹的运气,在其他平台上你的程序可能会崩溃,因为指向 int 转换的指针被截断,并且因为 toupper 之外的整数上的行为unsigned char 范围(加上 EOF)未定义。

要将整个字符串转换为大写,您必须遍历所有字符并对每个字符调用 toupper。您可以轻松编写执行此操作的函数:

void strtoupper(char *str)
{
while(toupper((unsigned char)*str++))
;
}

注意 unsigned char 转换 - 所有处理字符分类和转换的 C 函数需要 intEOF(保持不变)或者是 unsigned char 的值。原因很悲哀也很复杂,我已经详述了in another answer .

仍然值得注意的是,toupper 设计 不能可靠地处理多字节字符编码(例如 UTF-8),因此它在现代文本中没有实际位置处理(通常大多数 C 语言环境设施都是在另一个时代(糟糕地)设计的)。

关于c - 上层函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15057899/

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