c - 上层函数

标签 c uppercase toupper

我想知道 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/

相关文章:

c - 如何使用函数填充结构中的值?

php - 将句子中的第一个单词更改为大写

java - 强制 stringBuilder 为大写

c - 实现一个程序,根据一个人的名字,打印一个人的姓名首字母

c - 多个 valgrind 错误 : Conditional jump or move depends on uninitialised value(s)

c - getenv() 将环境返回为 null?

regex - 删除R中字符串中大写字母的第一个实例之前的字符

vim - 在vim中将指定行更改为大写

c - char 和 toupper 的结果不明确

c - 在 OS X Yosemite 上运行 `locale -a` 时 LANG 和 LC_ALL 为空是不是很糟糕?