C语言中反转后字符串首字符为换行的原因及解决方法
问题原因
- fgets读取了换行符:
fgets()会将用户输入结束时按下的回车键(对应字符\n)一并读取到字符串中。输入"oi"后,str实际存储的内容是"oi\n",用strlen()计算得到的长度t为3(包含\n)。 - 反转逻辑把换行符放到了开头:循环从
j = t-1(即索引2)开始赋值,str[2]就是\n,所以str2[0]被赋值为\n,导致反转后的字符串首字符是换行符,输出时表现为开头的空白(换行)。 - 未添加字符串终止符:原代码中
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
相关产品推荐
相关产品推荐

