You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:37:45