C语言不使用内置库实现字符串反转时遇到问题
问题分析与解决方案
你遇到的问题主要有两个:一个是编译器的缩进警告,另一个是字符串反转后无法正确输出,下面逐个拆解解决:
1. 缩进警告的原因与修复
你的size_string函数里,for循环后面多了一个分号;,这会让循环体变成空语句——循环只会执行计数操作,没有其他逻辑。而后续的return count;虽然逻辑上是在循环结束后执行,但代码缩进让编译器误以为它是循环的一部分,从而触发-Wmisleading-indentation警告。
修复方法很简单,要么去掉循环后的分号,要么用花括号明确空循环(更规范),同时调整代码格式提升可读性:
// 修正后的size_string函数 int size_string(char a[]) { int count = 0; // 去掉多余分号,或写成 for(...) {} 明确空循环 for(count = 0; a[count] != '\0'; count++); return count; } // 更易读的替代写法(推荐) int size_string(char a[]) { int count = 0; while(a[count] != '\0') { count++; } return count; }
2. 字符串反转失败+无输出的核心问题
你的反转逻辑存在两个致命错误,直接导致了输出异常:
错误1:索引越界,导致字符串被截断
在reverse函数中,你写的是*(p+size-i),但数组索引从0开始,长度为size的字符串,最后一个有效字符的索引是size-1。当i=0时,p+size-i指向的是字符串结束符'\0',把它交换到数组开头后,printf("%s",a)会认为字符串从开头就是结束符,自然什么都不输出。
正确的索引应该是p + size - 1 - i,这样才能交换第i个字符和倒数第i+1个字符:
// 修正后的reverse函数 void reverse(char *p, int size) { int i; char temp; for(i = 0; i < size/2; i++) { temp = *(p + i); *(p + i) = *(p + size - 1 - i); // 修正索引 *(p + size - 1 - i) = temp; } }
错误2:fgets读取了换行符,影响反转结果
fgets会把用户输入时按下的回车键(\n)也读取到字符串中,这个换行符会被size_string计入长度,反转后会跑到字符串开头,导致输出异常(甚至因为上面的索引错误直接空输出)。
解决方法是在计算完size后,检查并移除换行符:
size = size_string(a); // 移除fgets读取的换行符 if(size > 0 && a[size-1] == '\n') { a[size-1] = '\0'; size--; }
修正后的完整代码
#include<stdio.h> int size_string(char a[]) { int count = 0; while(a[count] != '\0') { count++; } return count; } void reverse(char *p, int size) { int i; char temp; for(i = 0; i < size/2; i++) { temp = *(p + i); *(p + i) = *(p + size - 1 - i); *(p + size - 1 - i) = temp; } } int main() { char a[45]; int size; printf("Enter a string : "); fgets(a, sizeof(a), stdin); size = size_string(a); // 处理fgets的换行符 if(size > 0 && a[size-1] == '\n') { a[size-1] = '\0'; size--; } printf("String length: %d\n", size); reverse(a, size); printf("Reversed string: %s\n", a); return 0; }
这样修改后,代码就能正确计算字符串长度、反转字符串并输出结果,同时消除了编译器的缩进警告。
内容的提问来源于stack exchange,提问作者Lovish Garg
相关产品推荐
相关产品推荐

