C语言实现字符串逆序、倒置字符串(字符串逆序问题的升级)

一.字符串逆序

问题描述:

输入一个字符串str,将其内容颠倒过来,并输出。

数据范围0<len(str)<10000

输入描述:

输入一个字符串,可以有空格

输出描述:

输出逆序的字符串

输入样例:

I am a student

输出样例:

tneduts a ma I

方法一:创建一个新的数组用来存储原数组内的字符串(反向存储),将新的数组输出

利用循环的方式将原字符串数组中的元素反向存储在新创建的字符串数组中,之后输出新的字符串数组。

代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
    char str[10000];//由于题目中要求的长度范围为0~10000,因此创建了长度为10000的数组
    char str2[10000];
    int i;
    gets(str);
    int size = strlen(str);
    for (i = 0; i < size; i++)
    
        str2[i] = str[size - i - 1];//利用新创建的数组来反向存储原数组中的数据
    
    str2[i] = 0;//确保输出结果的正确性
    puts(str);
    return 0;
}

得到输出结果为

 

方法二:利用指针对字符串数组进行逆置,逆置后输出

1.定义char类型指针left,用来指向字符串数组的首元素;

2.定义char类型指针right,用来指向字符串的最后一个元素;

3.循环进行首元素和尾元素的交换,之后left右移,right左移,直至left等于right时,循环结束,字符串完成逆置。

 代码如下:

void Reverse(char* str)
{
    char* left = str;//left指向字符串数组的首元素
    char* right = str + strlen(str)-1;//right指向字符串的最后一个元素
    while(left < right)//进行首元素和尾元素的交换,直至left等于right为止,此时字符串完成1逆置
    {
        char temp = *left;
        *left = *right;
        *right = temp;
        ++left;
        --right;
    }
}
 
 
int main()
{
    char str[10000];
    gets(str);
    Reverse(str);
    puts(str);
    return 0;
}

二.倒置字符串(字符串逆序问题的升级)

题目描述(题目来源:牛客网):

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

输入描述:

每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100

输出描述:

依次输出倒置之后的字符串,以空格分割

输入样例:

I like beijing.

输出样例:

beijing. like I

解题思路: 

1.首先将整个字符串逆置;

2.之后将每个单词逆置(最后一个单词结尾非空格);

3.逆置时不要逆置‘\0’

 

首先创建逆置函数,原理如上述以指针进行逆置的方式,代码如下:

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

根据逆置函数首先对整个字符串进行逆置

 Reverse(str,str+strlen(str)-1);

之后依次遍历字符串,依次对每个单词进行逆置 

    char* left = str;
    char* right = str;
    while (*left != '\0')
    {
        while (*right != ' ' && *right != '\0')
            right++;
        if (*right == ' ')
        {
            Reverse(left, right - 1);
            right++;
            left = right;
        }
        else
        {
            Reverse(left, right - 1);
            left = right;
        }
    }

源码如下:

#include <stdio.h>
#include <string.h>
void Reverse(char* left, char* right)
{
    while (left < right)
    {
        char temp = *left;
        *left = *right;
        *right = temp;
        ++left;
        --right;
    }
}
int main()
{
    char str[100];
    gets(str);
    //首先进行整体逆置
    Reverse(str,str+strlen(str)-1);

    char* left = str;
    char* right = str;
    while (*left != '\0')
    {
        while (*right != ' ' && *right != '\0')
            right++;
        if (*right == ' ')
        {
            Reverse(left, right - 1);
            right++;
            left = right;
        }
        else
        {
            Reverse(left, right - 1);
            left = right;
        }
    }
    printf("%s\n", str);
    return 0;
}

运行结果如下:

 

  • 24
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li_yizYa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值