如何正确比较单个字符并消除strcmp相关编译器警告?
解决strcmp比较单个字符的编译器警告问题
警告原因
strcmp函数的参数要求是指向字符串的指针(const char*),但你传入的string[i]和string[j]是单个char类型的字符(本质是ASCII整数)。编译器会把这个整数强制转换成指针,因此触发了pointer from integer without a cast的警告。另外,你用strcpy复制单个字符也是错误的——strcpy是用来处理字符串的,单个字符直接赋值即可。
两种解决方法
方法1:直接比较字符(推荐)
单个字符本质是ASCII值,直接用关系运算符</>/==比较即可,完全不需要strcmp:
#include <stdio.h> #include <string.h> int main() { char string[100]; fgets(string, sizeof(string), stdin); // 可选:去掉fgets读入的换行符 size_t length = strlen(string); if (length > 0 && string[length-1] == '\n') { string[--length] = '\0'; } for(int i = 0; i < length; i++) { for(int j = i+1; j < length; j++) { char temp; // 直接比较单个字符的ASCII值 if(string[i] < string[j]) { // 单个字符直接赋值交换,无需strcpy temp = string[i]; string[i] = string[j]; string[j] = temp; } } } /* … 后续统计字母出现次数的代码 … */ return 0; }
方法2:用strcmp比较(不推荐,仅满足需求)
如果一定要用strcmp,需要传递指向单个字符的指针(即该字符的地址&string[i]),因为strcmp需要字符串指针。但要注意:strcmp会从该地址开始一直比较到'\0',如果只是想比较单个字符,这种方法冗余且容易出错:
// 仅修改排序逻辑部分 for(int i = 0; i<length; i++) { for(int j =i+1; j<length; j++) { char temp; // 传递字符地址给strcmp if(strcmp(&string[i], &string[j]) < 0) { // 单个字符直接赋值交换 temp = string[i]; string[i] = string[j]; string[j] = temp; } } }
关键总结
- 单个字符比较用关系运算符最直接高效;
strcmp和strcpy是为以'\0'结尾的字符串设计的,不要用来操作单个字符。
内容的提问来源于stack exchange,提问作者Rakesh
相关产品推荐
相关产品推荐

