移除isalpha后单词回文检测函数恒返回0的问题排查与解决
单词回文检测函数始终返回0的问题解决
问题背景
我需要实现句子和单词的回文检测功能,其中句子回文检测函数运行正常,但单词回文检测函数无论输入是否为回文,始终返回0。原以为移除句子检测里跳过非字母字符的判断不影响单词检测,现在需要排查原因并仅用指针解决问题。
正常运行的句子回文检测函数
int checkSentencepalindrome(char * str) { size_t len = strlen(str); char *pntr1 = str; char *pntr2 = str + len - 1; while(pntr2 >= pntr1) { if (!isalpha(*pntr2)) { pntr2--; continue; } if (!isalpha(*pntr1)) { pntr1++; continue; } if(tolower(*pntr1) != tolower(*pntr2)) { return 0; } pntr1++; pntr2--; } return 1; }
存在问题的单词回文检测函数
int checkWordpalindrome(char * str) { size_t len = strlen(str); char *pntr1 = str; char *pntr2 = str + len - 1; while(pntr2 >= pntr1) { if(tolower(*pntr1) != tolower(*pntr2)) { return 0; } pntr1++; pntr2--; } return 1; }
问题复现的完整代码
int checkWpalindrome(char * str) { printf("%s ", str); size_t len = strlen(str); if(len == 0) { return 0; } char *pntr1 = str; char *pntr2 = str + len - 1; while(pntr2 >= pntr1) { if(tolower(*pntr1) != tolower(*pntr2)) { return 0; } pntr1++; pntr2--; } return 1; } void input(char * str) { printf("Input: "); fgets(str, 101, stdin); fflush(stdin); } int main() { char arr[10]; input(arr); printf("%d", checkWpalindrome(arr)); return 0; }
问题原因
问题出在fgets函数的行为上:它会把用户输入时按下的换行符\n也读取到字符串中。比如输入回文单词level,数组中实际存储的是"level\n",此时strlen计算的长度是6。检测时,第一个字符是'l',最后一个字符是'\n',tolower处理后两者不相等,函数直接返回0。
解决方案(仅用指针实现)
在检测前,先处理字符串末尾的换行符。可以通过指针定位到字符串末尾,判断是否为换行符,若是则将其替换为字符串结束符\0,修正字符串长度。修改后的checkWpalindrome函数如下:
int checkWpalindrome(char * str) { printf("%s ", str); size_t len = strlen(str); if(len == 0) { return 0; } // 用指针处理末尾的换行符 char *end_ptr = str + len - 1; if(end_ptr >= str && *end_ptr == '\n') { *end_ptr = '\0'; len--; } char *pntr1 = str; char *pntr2 = str + len - 1; while(pntr2 >= pntr1) { if(tolower(*pntr1) != tolower(*pntr2)) { return 0; } pntr1++; pntr2--; } return 1; }
这样处理后,输入回文单词时,换行符被移除,字符串长度正确,检测逻辑就能正常工作。
内容的提问来源于stack exchange,提问作者wolffsen
相关产品推荐
相关产品推荐

