C代码用strcmp判断字符串首字符时出现-Wint-conversion警告的求助
C语言代码问题:筛选以特定字符开头的字符串
原代码
#include <stdio.h> #include <string.h> int main () { int i, containizioa,lenstringa; char stringa[20], stringhemin3[20], strG[30]; containizioa = 0; for (i = 0; i < 7; i++) { printf("Inserisci una stringa\n"); scanf("%s", stringa); if (strcmp(stringa[0], "a")) { containizioa++; } lenstringa = strlen(stringa); if (lenstringa <= 3) { strcat(stringhemin3, " "); strcat(stringhemin3, stringa); } if (strcmp(stringa[0], "g")) { strcat(strG, "_"); strcat(strG, stringa); } } printf("Le stringhe di lunghezza inferiore o uguale a 3 sono: %s\n",stringhemin3); printf("Il numero di stringhe che iniziano per a è: %d\n", containizioa); printf("Le stringhe che iniziano per g sono: %s", strG); return 0; }
编译警告
warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [-Wint-conversion]
问题描述
尝试去掉[0]后,代码会统计所有包含'g'的字符串;替换为[1]也出现同样问题,请问该如何解决?
解决方案
1. 修复字符比较的错误
strcmp是用来比较两个字符串的函数,参数必须是char*类型的指针,但stringa[0]是单个字符(char类型),类型不匹配才会触发编译警告。要判断字符串首字符是否为'a'或'g',直接用字符相等比较即可,注意用单引号包裹字符常量:
- 把
if (strcmp(stringa[0], "a"))改为if (stringa[0] == 'a') - 把
if (strcmp(stringa[0], "g"))改为if (stringa[0] == 'g')
另外要注意:原代码中strcmp的逻辑是反的——strcmp返回0表示两个字符串相等,原来的if(strcmp(...))会在字符不相等时执行代码,和你统计以'a'/'g'开头的意图完全相反,这也是隐藏的逻辑错误。
2. 初始化目标字符串
stringhemin3和strG定义后未初始化,直接调用strcat会导致未定义行为(strcat需要目标字符串以'\0'结尾才能找到正确的拼接位置)。定义时直接初始化为空字符串:
char stringa[20], stringhemin3[20] = "", strG[30] = "";
3. 避免输入溢出
scanf("%s", stringa)如果输入超过19个字符(数组长度20,需留一个位置存'\0')会导致缓冲区溢出,建议限制输入长度:
scanf("%19s", stringa);
修复后的完整代码
#include <stdio.h> #include <string.h> int main () { int i, containizioa, lenstringa; char stringa[20], stringhemin3[20] = "", strG[30] = ""; containizioa = 0; for (i = 0; i < 7; i++) { printf("Inserisci una stringa\n"); scanf("%19s", stringa); // 统计以'a'开头的字符串 if (stringa[0] == 'a') { containizioa++; } lenstringa = strlen(stringa); if (lenstringa <= 3) { strcat(stringhemin3, " "); strcat(stringhemin3, stringa); } // 拼接以'g'开头的字符串 if (stringa[0] == 'g') { strcat(strG, "_"); strcat(strG, stringa); } } printf("Le stringhe di lunghezza inferiore o uguale a 3 sono: %s\n", stringhemin3); printf("Il numero di stringhe che iniziano per a è: %d\n", containizioa); printf("Le stringhe che iniziano per g sono: %s\n", strG); return 0; }
内容的提问来源于stack exchange,提问作者Vitaliano17
相关产品推荐
相关产品推荐

