当我尝试使用toupper时,编译器会给我这个错误:"警告:从指针转换为不同大小的整数。"和"警告:赋值使整数指针无需强制转换。"为什么呢?
for(i=0;i<argc;i++){
argv[i]=(char)toupper((char)argv[i]);
}
答案 0 :(得分:5)
argv是char**
,指向指针的指针。可以把它想象成一个字符串数组,而不是字符串。
使用[i]
建立索引会删除一个间接级别,因此argv[i]
是指向字符的指针,char*
。
toupper()
是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]);
}
}
您可以了解为什么toupper()
的参数应转换为unsigned char
in Keith Thompson's excellent answer elsewhere on SO