当我尝试使用 toupper 时,编译器给了我这个错误:“警告:从指针转换为不同大小的整数。” 和“警告:赋值使指针从整数不进行强制转换。” 为什么?
for(i=0;i<argc;i++){
argv[i]=(char)toupper((char)argv[i]);
}
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