逆序字符串问题

  1. 题目
    1. 算法分析
    2. 效果展示
    3. 参考代码

题目

有一个字符数组的内容为: student a am i ,请将数组的内容改为 i am a student

要求:

不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。

算法分析

先将整个字符串整体逆置,再以每个单词为对象局部逆置(这时判断条件复杂一些);这里逆置时,需要一个逆置函数,需要两个参数,首指针和尾指针,由这两个指针锁定一个区域,将里面的字符从头至尾逆置

注意:

  • 最后一次跳出while循环时,相当于*pcur==’\0’,所以最后这个单词没有逆置,需要再次调用逆置函数
  • if(表达式){语句1}语句2;这样的结构,无论if表达式成立与否,语句2都会执行的

    效果展示

    图片加载

参考代码

#include <stdio.h>  
#include <assert.h>  

int my_strlen(const char *str)  
{  
    int count = 0;  
    assert(str);  
    while(*str++)  
    {  
        count++;  
    }  
    return count;  
}  

void reverse_str(char *left,char *right)  
{  
    assert(left);  
    assert(right);  
    while(left < right)  
    {  
        char temp = *left;  
        *left = *right;  
        *right = temp;  
        left++;  
        right--;  
    }  
}  

void reverse(char *str)  
{  
    assert(str);  
    char *left = str;  
    char *right = str + my_strlen(str) - 1;  
    reverse_str(left,right);      
}  

int main()  
{  

    char arr[] = "student a am i";  
    printf("请逆转每个单词:%s\n\n",arr);  
    char *pcur = arr;   
    //逆序字符串   
    reverse(arr);  
    //逆序单词  
    while(*pcur)  
    {  
        char *start = pcur;  
        while(*pcur != ' '&&*pcur != '\0')  
        {  
            pcur++;  
        }  
        reverse_str(start,pcur-1);  
        if(*pcur == ' ')  
            pcur++;       
    }  
    printf("逆转后的结果:\n");      
    puts(arr);  
    return 0;  
 }   

部分资料来源于网络,版权属其原著者所有,只供学习交流之用。如有侵犯您的权益,请联系【公众号:码农印象】删除,可在下方评论,亦可邮件至ysluckly.520@qq.com。互动交流时请遵守宽容、换位思考的原则。

×

喜欢就点赞,疼爱就打赏

(function(){ var bp = document.createElement('script'); bp.src = '//push.zhanzhang.baidu.com/push.js'; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();
休闲小游戏