使用指针实现字符串反转时输出乱码,如何仅显示反转后的字符串?
字符串反转程序乱码问题修复
问题描述
希望通过指针实现字符串反转功能,程序可运行但输出随机乱码。需求示例:输入hello,输出olleh。原代码如下:
#include <stdio.h> int main(void) { char string[30]; printf("Enter string: "); scanf("%s",&string); int x =sizeof(string)/sizeof(string[0]); char *p1 = string; char *p2 = &string[x-1]; char temp; while(p1<=p2) { temp = *p1; *p1 = *p2; *p2 =temp; p1++; p2--; } for(p1 =&string[0];p1<=&string[x - 1];p1++) { printf("%c",*p1); } return 0; }
错误原因
scanf参数错误:scanf("%s", &string)写法冗余,数组名string本身就是首元素地址,无需添加&。- 字符串长度计算错误:
sizeof(string)/sizeof(string[0])得到的是数组总容量30,而非实际输入的字符串长度。数组中未被输入字符填充的位置是未初始化的垃圾数据,反转时会把这些乱码也包含进去,导致输出异常。 - 输出逻辑错误:循环遍历整个数组输出,会把未初始化的垃圾字符一并打印出来。
修复方案
- 引入
<string.h>头文件,使用strlen()获取实际输入的字符串长度。 - 修正
scanf参数为scanf("%s", string)。 - 反转时仅针对字符串有效字符(从首地址到
strlen(string)-1的位置)。 - 输出时直接使用
printf("%s", string),利用字符串结束符'\0'自动终止输出,无需手动循环。
修改后的代码
#include <stdio.h> #include <string.h> // 引入strlen所需头文件 int main(void) { char string[30]; printf("Enter string: "); scanf("%s", string); // 数组名直接作为地址,无需& int len = strlen(string); // 获取实际输入的字符串长度 char *p1 = string; char *p2 = string + len - 1; // 指向最后一个有效字符 char temp; while (p1 < p2) // 用<避免奇数长度字符串的中间字符重复交换 { temp = *p1; *p1 = *p2; *p2 = temp; p1++; p2--; } printf("%s\n", string); // 直接输出字符串,自动识别结束符'\0' return 0; }
补充说明
strlen()会计算到字符串结束符'\0'之前的字符数,确保只处理用户输入的有效内容。- 反转循环用
p1 < p2比<=更高效,奇数长度字符串的中间字符无需交换,不影响结果但减少一次无意义操作。
内容的提问来源于stack exchange,提问作者user20082734
相关产品推荐
相关产品推荐

