【C语言】字符串逆序

发布于:2024-06-05 ⋅ 阅读:(148) ⋅ 点赞:(0)

(来源:牛客网)

题目

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

数据范围:1≤len(str)≤10000 

输入描述:

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

输出描述:

输出逆序的字符串

示例1

输入

I am a student

输出

tneduts a ma I

示例2

输入

nowcoder

输出

redocwon

问题解析:

逆置字符串和逆置数组本质是一样的,就是首、尾两个指针指向的内容交换,指针移动往中间推进,直到相遇。

 第一步

首先我们得处理:输入字符串。

我们创建一个字符数组,因为数据范围:1≤len(str)≤10000 ,所以数组大小最好为10001而不是10000,预留一个'\0'的空间。

char str[10001]={0};

注意:scanf在读字符串时,遇到'\0'会结束,而我们的要求是输入可以有空格。所以写成下面这样是不行的。

scanf("%s",str);

为了解决这个问题,这时我们应该使用的函数是gets。它的头文件是stdio.h。

gets可以无限读取,不会判断上限,从stdin流中读取字符串,以回车或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。

#include<stdio.h>
int main()
{
    char str[10001];
    gets(str);//这样就能输入一个字符串(可有空格)到str中
    reverse(str);//将字符逆序封装为函数
    printf("%s\n",str);
    return 0;
}
 第二步

 那么,现在问题就是,我们怎么来逆序呢(怎么写函数reverse)?

我们传的是数组名,而数组名本身就是指针,所以属于传址调用,所以会改变main函数中数组str的内容,也就意味着我们的返回类型可以是void。

我们就可以搭出函数的框架:

void reverse(char str[])//or void reverse(char* str)
{
    //
}
 字符逆序的实现逻辑

上面已经说了,其实就是创建两个指针,分别存放字符串的首字符地址和最后一个字符的地址,让其指向的内容交换,指针移动(往中间推进),直到相遇时停止。

可能有人会想到先逆着遍历字符串,然后创建一个新的数组来接收,最后再打印出新数组。但这种方法,并没有前者好,因为要创建一个新数组,而且不如前者贴合题意。

其中,把最后一个字符的地址赋给其中一个指针,需要我们先用strlen()求出字符串的长度:

#include<string.h>

int len=strlen(str);
char* left=str;
char* right=&str[len-1];//char* right=left+len-1;

 指针移动就一个++,一个--:

void reverse(char* str)
{
    int len=strlen(str);
    char* left=str;
    char* right=&str[len-1];

    while(left<right)
    {
        char tmp;//创建中间变量来帮助交换
        tmp=*left;
        *left=*right;
        *right=tmp;
        left++;
        right--;
    }
}

 

完整代码参考:

#include <stdio.h>
#include<string.h>
void reverse(char* str)
{
    int len=strlen(str);
    char* left=str;
    char* right=&str[len-1];

    while(left<right)
    {
        char tmp;
        tmp=*left;
        *left=*right;
        *right=tmp;
        left++;
        right--;
    }
}
int main()
{
    char str[10001]={0};
    gets(str);
    reverse(str);
    printf("%s",str);
    return 0;
}

 

到此,本文就结束了,祝阅读愉快^_^ 


网站公告

今日签到

点亮在社区的每一天
去签到