-3

当我尝试使用 toupper 时,编译器给了我这个错误:“警告:从指针转换为不同大小的整数。” 和“警告:赋值使指针从整数不进行强制转换。” 为什么?

for(i=0;i<argc;i++){
  argv[i]=(char)toupper((char)argv[i]);
}
4

1 回答 1

5

argv 是 a char**,指向指针的指针。将其视为字符串数组,而不是字符串。

索引 with[i]删除了一级间接性,argv[i]指向字符的指针 a 也是如此char*

toupper()is int toupper (int c);- 它期望单个字符作为整数,而不是指向字符的指针,但是当你传递它char*时你正在传递它argv[i],然后你试图将它转换为char...一个普通的旧字符,它通常有不同的大小为指针。

argc表示有多少命令行参数,argv[0]通常是可执行文件名。用于strlen获取 中每个参数的长度argv

要将每个参数的全部转换为大写:

for (int i = 0; i < argc; i++) {
    size_t len = strlen(argv[i]);
    for (size_t j = 0; j < len; j++) {
        argv[i][j] = (char)toupper((unsigned char)argv[i][j]);
    }
}

您可以在 Keith Thompson 在 SO 其他地方的出色回答中了解为什么toupper()应该将论点转换为unsigned char

于 2015-07-12T22:56:56.440 回答