C语言不使用<string.h>反转字符串输出多余字符如何解决
问题根源
C语言的字符串以空字符\0作为结束标识,printf("%s")输出字符串时,会从传入的首地址开始持续读取字符,直到遇到\0才终止。你的代码仅将原字符串的字符逐个反转赋值给c3,没有在c3的末尾手动添加\0,输出时就会读取c3数组边界外的内存内容,直到碰到内存中随机存在的\0才会停止,因此会出现超出预期长度的乱码字符。
其他代码问题修正
- 禁止使用
gets()函数:该函数不校验输入长度,极易造成缓冲区溢出,已经从C11标准中正式移除,建议替换为fgets()控制输入长度 fflush(stdin)属于未定义行为:C标准仅规定fflush()对输出流的刷新效果,对输入流使用fflush()的结果取决于编译器实现,不具备跨平台兼容性
修复后可运行代码
#include <stdio.h> #include <stdlib.h> int main() { char c1[10]; char c3[10]; int i,j,l; printf("输入要反转的字符串:\n"); // 用fgets替代gets,指定最大输入长度避免溢出 fgets(c1, sizeof(c1), stdin); // 移除fgets读取到的末尾换行符 for(i = 0; c1[i] != '\0' && c1[i] != '\n'; i++); c1[i] = '\0'; // 计算原字符串长度 for(i = 0; c1[i] != '\0'; i++); l = i; j = 0; // 反转字符赋值 for(i = l-1; i >= 0; i--) { printf("%d %d\n", i, j); c3[j] = c1[i]; j++; } // 为反转后的字符串添加结束标记,是解决输出超长的核心步骤 c3[j] = '\0'; printf("反转结果:%s", c3); return 0; }
内容的提问来源于stack exchange,提问作者AzGarD IAN
相关产品推荐
相关产品推荐

