2401_89115052 2025-08-10 22:26 采纳率: 37.5%
浏览 12
已结题

C语言字符串、数组与指针

#C语言实现字符串逆序

#include<stdio.h>
void rev(char* p,int sz); 
int main()
{
    char str[10];
    scanf("%s",str);
    int SZ;
    SZ=sizeof(str)/sizeof(str[0])-2;
    rev(str,SZ);
    printf("%s",str); 
    return 0;
}

void rev(char* p,int sz)
{
    int i;
    for(i=0;i<sz-i;i++)
    {
        char tmp='0';
        tmp=*(p+i);
        *(p+i)=*(p+sz-i);
        *(p+sz-i)=tmp;
    }
}

运行后什么都不显示,怎么回事

  • 写回答

7条回答 默认 最新

  • 檀越@新空间 2025-08-10 22:27
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你提供的代码是用于实现字符串逆序的,但在运行时没有输出,这说明程序可能在执行过程中出现了错误。下面我将详细分析问题,并给出解决方案。


    一、问题分析

    1. sizeof(str)/sizeof(str[0]) - 2 的计算错误

    SZ = sizeof(str)/sizeof(str[0]) - 2;
    
    • str 是一个字符数组,大小为 10
    • sizeof(str)10 * sizeof(char) = 10
    • sizeof(str[0])1(因为 char 占 1 字节)。
    • 所以 sizeof(str)/sizeof(str[0]) = 10
    • 然后减去 2,得到 SZ = 8

    这个计算是不正确的,因为:

    sizeof(str) 是整个数组的字节数,而不是字符串长度。

    如果用户输入的是 "abc",那么 str 中只有前 4 个字符(包括结尾的 \0),其余为空。

    因此,SZ 的值并不等于字符串的实际长度,而是基于数组大小的固定值,导致函数 rev 操作了无效的位置。


    2. rev 函数逻辑错误

    for(i=0; i < sz - i; i++)
    {
        char tmp = '0';
        tmp = *(p + i);
        *(p + i) = *(p + sz - i);
        *(p + sz - i) = tmp;
    }
    
    • 这个循环条件 i < sz - i 实际上等价于 i < sz / 2
    • sz 是从 main() 传入的,而它不是字符串实际长度,而是 8
    • 更严重的是,*(p + sz - i) 可能越界访问内存(比如当 sz = 8i = 0p + 8 可能已经超出数组边界)。

    3. 未正确处理字符串结束符 \0

    • 在交换字符时,如果 sz 不是字符串的真实长度,可能会把 \0 也参与交换,导致字符串无法正确打印。

    二、正确的做法:使用 strlen 获取字符串长度

    为了正确地进行字符串逆序,应该使用 strlen 来获取字符串的长度,而不是依赖 sizeof


    三、修改后的代码如下:

    #include <stdio.h>
    #include <string.h>
    
    void rev(char* p, int len);
    
    int main()
    {
        char str[10];
        scanf("%s", str);
        
        int len = strlen(str);  // 获取字符串长度
        rev(str, len);
        
        printf("%s\n", str); 
        return 0;
    }
    
    void rev(char* p, int len)
    {
        for (int i = 0; i < len / 2; i++) {
            char tmp = p[i];
            p[i] = p[len - 1 - i];
            p[len - 1 - i] = tmp;
        }
    }
    

    四、关键点说明

    1. 使用 strlen 获取字符串长度

      strlen(str) 返回的是字符串中有效字符的数量(不包含 \0

    2. 避免使用 sizeof 计算字符串长度

      sizeof(str) 是数组的总大小,而不是字符串的有效长度。

    3. 循环只到 len / 2

      保证每个字符都只交换一次,不会重复交换。

    4. 确保 str 数组足够大

      str[10] 足够容纳最多 9 个字符(加上 \0)。


    五、示例运行

    输入:

    hello
    

    输出:

    olleh
    

    六、总结

    | 问题 | 原因 | 解决方案 | |------|------|----------| | 无输出 | SZ 计算错误,导致函数操作越界 | 使用 strlen 获取字符串长度 | | 逆序失败 | 循环条件或索引错误 | 使用 len / 2 控制循环次数 | | 内存越界 | sz 不是字符串真实长度 | 避免使用 sizeof,改用 strlen |


    如果你还有其他关于 C 语言的问题,欢迎继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 8月19日
  • 已采纳回答 8月11日
  • 创建了问题 8月10日