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

C语言中反转后字符串首字符为换行的原因及解决方法

问题原因
  1. fgets读取了换行符:fgets()会将用户输入结束时按下的回车键(对应字符\n)一并读取到字符串中。输入"oi"后,str实际存储的内容是"oi\n",用strlen()计算得到的长度t为3(包含\n)。
  2. 反转逻辑把换行符放到了开头:循环从j = t-1(即索引2)开始赋值,str[2]就是\n,所以str2[0]被赋值为\n,导致反转后的字符串首字符是换行符,输出时表现为开头的空白(换行)。
  3. 未添加字符串终止符:原代码中str2反转后没有手动添加'\0',虽然局部变量可能默认有0值,但这是不安全的,可能导致输出乱码。
解决方法

1. 移除fgets读取的换行符

在计算字符串长度后,检查并替换换行符为字符串终止符,同时更新长度:

t = strlen(str);
// 若最后一个字符是换行符,替换为'\0'并缩短长度
if (t > 0 && str[t-1] == '\n') {
    str[t-1] = '\0';
    t--;
}

2. 确保反转后的字符串以'\0'结尾

在循环结束后,给str2添加字符串终止符:

for(i=0,j=(t-1);i<t;i++,j--){
    str2[i] = str[j];
}
str2[t] = '\0'; // 添加终止符

修改后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM 50
int main(){
    int i,j,t;
    char str[TAM],str2[TAM];
    printf("Digite a string:");
    fgets(str,TAM,stdin);
    setbuf(stdin,NULL);
    
    t = strlen(str);
    // 移除换行符
    if (t > 0 && str[t-1] == '\n') {
        str[t-1] = '\0';
        t--;
    }
    
    for(i=0,j=(t-1);i<t;i++,j--){
        str2[i] = str[j];
    }
    str2[t] = '\0'; // 添加终止符
    
    printf("str1:%s\nstr2:%s\n",str,str2);
}

此时输入"oi",输出会是:

str1:oi
str2:io

内容的提问来源于stack exchange,提问作者Weder Araujo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:25:29