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

使用指针实现字符串反转时输出乱码,如何仅显示反转后的字符串?

字符串反转程序乱码问题修复

问题描述

希望通过指针实现字符串反转功能,程序可运行但输出随机乱码。需求示例:输入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;
}

错误原因

  1. scanf参数错误:scanf("%s", &string)写法冗余,数组名string本身就是首元素地址,无需添加&。
  2. 字符串长度计算错误:sizeof(string)/sizeof(string[0])得到的是数组总容量30,而非实际输入的字符串长度。数组中未被输入字符填充的位置是未初始化的垃圾数据,反转时会把这些乱码也包含进去,导致输出异常。
  3. 输出逻辑错误:循环遍历整个数组输出,会把未初始化的垃圾字符一并打印出来。

修复方案

  1. 引入<string.h>头文件,使用strlen()获取实际输入的字符串长度。
  2. 修正scanf参数为scanf("%s", string)。
  3. 反转时仅针对字符串有效字符(从首地址到strlen(string)-1的位置)。
  4. 输出时直接使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:55:24