原书中读取字符串使用了gets(),使用此函数读取字符串很危险,因此改用了fgets()替代,修改后代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 4 int main(void) 5 { 6 char str[100], stack[100]; 7 int i, len, mid, next, top; 8 9 fgets(str, sizeof(str), stdin); 10 len = strlen(str);//including ' ' 11 mid = len / 2 - 1;//求字符串的中点 12 13 top = 0;//初始化栈 14 for (i = 0; i <= mid; i++){//将mid前的字符依次压入堆栈 15 stack[++top] = str[i]; 16 } 17 18 //判断字符串长度是奇数还是偶数,以决定需要匹配的后半部分起始下标 19 next = (len % 2) ? (mid+2) : (mid+1); 20 21 //开始匹配 22 for (i = next; i <= len - 1; i++){ 23 if (str[i] != stack[top]) break; 24 top--; 25 } 26 27 //验证结果 28 if (top == 0) 29 printf("YES "); 30 else 31 printf("No "); 32 33 return 0; 34 }
gets()与fgets()之间的区别,请参看我的另一篇文章《字符串读取引申的问题》,只是要注意的是输入字符串请采用重定向哦,如果手工输入再回车会导致strlen()返回的长度比实际长度大1,原因是多读入了一个换行符。
当然,也没必要非要把这个问题搞这么复杂,因为字符串存储在一个字符数组中,在知道字符串长度的情况下,我们完全可以通过两个指针,一个指向第一个字符,另一个指向最后一个字符,比较两者是否相等。如果相等,两个指针就同时向中间移动一个元素,进行下一轮比较;如果不等,则比较结束,表示该字符串不是回文字符串;如果直到指针移动到中间位置任然不存在不相等的情况,则表示该字符串是回文字符串。代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 4 int isHuiWen(char s[], int len){ 5 int i, mid = len / 2;//遍历到mid之前的元素停止 6 7 for (i = 0; i < mid; i++){ 8 if (s[i] == s[len - i - 1])continue; 9 else return 0; 10 } 11 return 1; 12 } 13 14 int main(void) 15 { 16 char str[100]; 17 int len; 18 19 fgets(str, sizeof(str), stdin); 20 len = strlen(str); 21 printf("%s of size %d ", str, len); 22 23 if (isHuiWen(str, len)){ 24 printf("YES "); 25 }else{ 26 printf("No "); 27 } 28 29 return 0; 30 }