【C语言】倒置字符串

倒置字符串

题目

描述

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

输入描述:

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

输出描述:

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

示例

输入:

I like beijing.

输出:

beijing. like I

解析

首先我们可以逆序整个字符串,然后用一个指针去识别空格,当遇到空格的时候就将前面的字符逆序,遇到’ \0 '就不让指针往后继续走了。

首先先要将字符串装起来,那这里就先用到gets()

int main() {
    
    
    char str[100] = {
    
    0};
    gets(str);
    return 0;
}

然后我们要写一个字符串逆序的函数,既可以用来在刚开始逆序整个字符串,也可以在后面用于逆序各个单词

逆序就很简单,设定两个指针从两边往中间靠近并交换,当左指针跑到右指针右边的时候函数停止

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

然后就是逆序整个字符串,我们就用一个strlen()拿到字符串长度,然后再“ -1+数组名 ”就可以拿到指向尾部的指针了

reverse(str, str + len - 1);

然后后面就是我们的一个一个单词的逆序,要逆序一个个单词,首先肯定要找到这些单词

那我们就可以先创建一个指针指向字符串开头,然后让它一直往后走,遇到两种情况做出操作:1.遇到空格 2.遇到’ \0 ’

所以这肯定是一个循环,当指针指向的不是空格或者’ \0 '时,指针就一直+1

	char* cur = str;
	while ( *cur != ' ' && *cur != '\0') {
    
    
            cur++;
	}

那当这个循环停止的时候,cur肯定已经指向了空格,-1就相当于拿到了右指针。那么这个时候要逆序前面的字符,我们肯定要拿到左指针,所以在开始的时候,我们就可以创建一个指针装开头的位置

然后我们就可以反转一个单词了

	char* cur = str;
	char* start = cur;
	while ( *cur != ' ' && *cur != '\0') {
    
    
		cur++;
    }
	reverse(start, cur - 1);

那这个时候,cur还指着那个空格,这时候就让cur++跳过这个空格,指向后面的字母

但是假如说我们找到的不是空格,而是’ \0 ',此时让它跳出就会产生未知的问题,所以我们这还要加一个if条件,让它只在遇到空格的时候++

	char* cur = str;
	char* start = cur;
	while ( *cur != ' ' && *cur != '\0') {
    
    
		cur++;
	}
	reverse(start, cur - 1);
	if (*cur != '\0')
    cur++;

写完上面的,实际上才逆序完一个单词,如果要让他继续往后探索,肯定还要再加一层循环,那么这个循环的条件要怎么写?

这一串代码,肯定要一直走到最后一个单词,那么什么代表我们找到了最后一个单词?

实际上当cur指向’ \0 '的时候,就说明我们已经找到了最后一个单词,那么当这个时候循环就可以结束了,所以我们在外面加一个以这个为条件的while循环即可

char* cur = str;
//我们这个初始化cur的代码只用执行一次,不要把它装到循环里了
    while (*cur) {
    
    
        char* start = cur;
        while ( *cur != ' ' && *cur != '\0') {
    
    
            cur++;
        }
        reverse(start, cur - 1);
        if (*cur != '\0')
            cur++;
    }

最后只用打印我们处理完的字符串,这个题目就算结束了

代码总览

#include <stdio.h>
void reverse(char* left, char* right) {
    
    
    while (left < right) {
    
    
        char tmp = *left;
        *left = *right;
        *right = tmp;
        right--;
        left++;
    }
}
int main() {
    
    
    char str[100] = {
    
    0};
    gets(str);
    int len = strlen(str);
    reverse(str, str + len - 1);
    char* cur = str;
    while (*cur) {
    
    
        char* start = cur;
        while ( *cur != ' ' && *cur != '\0') {
    
    
            cur++;
        }
        reverse(start, cur - 1);
        if (*cur != '\0')
            cur++;
    }
    printf("%s",str);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42150700/article/details/129629052