c语言经典习题之逆序字符串详解

目录
  • 使用指针逆序字符串
  • 使用递归逆序字符串
  • 逆序带空格的字符串
  • 总结

使用指针逆序字符串

思路:

  • 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置
  • 交换两个指针位置上的字符
  • left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束
void reverse_string(char* str)
{
	char* left = str;//首元素
	char* right = str + strlen(str) - 1;//最后一个元素
	while (left < right)//交换
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
    //更新下标
		left++;
		right--;
	}
}
int main()
{
	char str[] = "abcdef";
	reverse_string(str);
	printf("%s", str);
	return 0;
}

使用递归逆序字符串

思路: 

  • 利用递归思想大事化小
  • 先将首元素放到一个变量中
  • 在将最后一个元素放到第一个元素位置
  • 再将最后一个空位置放上\0便于递归逆序中间字符
  • 最后再将首元素放到最后位置

void reverse_string(char* str)
{
	int len = strlen(str);
	char tmp = *str;//拿出首元素放到tmp里
	*str = *(str + len- 1);//然后把最后一个元素放到第一个元素位置
	*(str + len - 1) = '\0';//把最后一个空位置放上一个\0
	if (strlen(str + 1) >= 2)//如果字符串还有两个以上字符就逆序
		reverse_string(str + 1);
	*(str + len - 1) = tmp;//最后把刚才在tmp里的元素放到字符串末尾
}
int main()
{
	char str[] = "abcdef";
	reverse_string(str);
	printf("%s", str);
	return 0;
}

逆序带空格的字符串

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

输入描述:

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

输出描述:

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

输入:

I like beijing.

输出:

beijing. like I

思路:

  • 第一步逆序每一个单词

  • 第二步整体逆序

#include <stdio.h>
//逆序字符串的函数
void reverse(char*left, char* right)
{
    while(left<right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main()
{
    char arr[100] = {0};
    //输入
    gets(arr);//读取一行
    //处理
    int len = strlen(arr);
    //1. 逆序每一个单词
    char* start = arr;
    char *end = arr;
    while(*start)
    {
        end = start;
        while(*end != ' '  && *end!='\0')//找空格前面的字符
        {
            end++;
        }
        //逆序一个单词
        reverse(start, end-1);//end此时指向空格,end-1就是指向空格前面的字符
        if(*end == ' ')//如果没有遇到空格就开始逆序下一个单词。
            start = end+1;
        else//如果遇到空格就停止不要在指向下一个字符
           start= end;
    }
 //2. 逆序整个字符串
    reverse(arr, arr+len-1);
    //输出
    printf("%s\n", arr);
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言 将字符串逆序输出的实例

    将字符串逆序输出:我先说一个我的错误代码,一开始真的不知道哪里错了,但是当时的想法是自以为是可以的,大家可以先看看我的错误代码 这个代码是错误的,正确的在最下方,不要急,我只是展示一下自己的错误,哈哈 #include <stdio.h> #include <iostream> #include <string.h> #include <math.h> using namespace std; void reverse(char a[]) { char *p

  • C语言中字符串实现正序与逆序实例详解

    C语言中字符串实现逆序实例详解 字符串逆序和正序的实现代码: #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <malloc.h> #include <string.h> /*定义*/ typedef struct node { char c; struct node *llink,*rlink; }stud; /*建立链表*/ stud * creat(voi

  • 使用C语言实现字符串逆序操作案例

    编写一个函数 reverse_string(char * string) 实现:将参数字符串中的字符反向排列. 要求:不能使用C函数库中的字符串操作函数. 非递归实现: #include<stdio.h> //编写一个函数 reverse_string(char * string)(非递归实现) //实现:将参数字符串中的字符反向排列. //要求:不能使用C函数库中的字符串操作函数. //求字符串长度 int my_strlen(char* str) { int count = 0; whil

  • C语言递归实现字符串逆序的方式详解

    C语言实现字符串逆序,具体内容如下所示: 一.迭代的方式实现 贴上代码:迭代的方式实现 '//字符串逆序:不可用字符串操作函数' #include <stdio.h> void swap(char* ch1, char* ch2) '//交换两个字符串' { char tmp = *ch1; *ch1 = *ch2; *ch2 = tmp; } int my_strlen(char* str) '//实现计算字符串字节数' { int count = 0; while (*str != '\0

  • C语言解字符串逆序和单向链表逆序问题的代码示例

    字符串逆序 上次面试碰到一个单向链表逆序的题目,幸好对字符串逆序比较熟悉,类比做出来了.字符串逆序比较简单,直接上代码: void stringReverse(char* p1,char* p2) { if(p1==p2)return; //swap the value of p1 ,p2 *p1=(*p1)+(*p2); *p2=(*p1)-(*p2); *p1=(*p1)-(*p2); if(p1==p2-1)return; else stringReverse(++p1,--p2); }

  • c语言经典习题之逆序字符串详解

    目录 使用指针逆序字符串 使用递归逆序字符串 逆序带空格的字符串 总结 使用指针逆序字符串 思路: 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置 交换两个指针位置上的字符 left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束 void reverse_string(char* str) { char* left = str;//首元素 char* right = str + strlen(str) - 1;//最后一个元素 w

  • C语言中二叉树的后序遍历详解

    目录 一.二叉树的后序遍历.(递归) 二.二叉树的后序遍历(迭代) 总结 首先我们从两个方面讲解二叉树的后序遍历(递归+迭代) 一.二叉树的后序遍历.(递归) 思想: 首先我们从二叉树的根节点开始先遍历其左孩子,①接着同样继续遍历其左孩子的左孩子,直到某个左孩子节点的左孩子为NULL时,②开始遍历其右孩子,如果其为NULL则访问该节点的值域,并返回其双亲节点重复第二步的操作,如果其不为NULL则以该节点为根节点重复第一步的操作.直到访问完所有节点时结束递归. 代码: void BTreePost

  • c#二进制逆序方法详解

    原题 一个整数,可以表示为二进制的形式,请给出尽可能多的方法对二进制进行逆序操作. 例如:10000110 11011000的逆序为 00011011 01100001 分析 题目中说是一个整数,对它的二进制进行逆序.并不是一个01字符串,或者01的数组.那么我们该如何解决这个问题呢?方法还是比较多的,有的中规中矩.有的非常巧妙.我们要掌握中规中规的方法,见识更多的巧妙的方法.慢慢的,能够举一反三,在遇到新的问题时,能够有灵思妙想. 最直接的方法 直接的方法,很容易想到:有如下代码: 复制代码

  • C语言 分析逆序字符串与字符串的逆序输出有什么区别

    目录 前言 一.字符串的逆序 二.实例讲解 1.字符串的逆序输出 2.逆序字符串 3.综合实例 总结 今天我们讲解字符串的逆序和逆序输出,并且通过一个综合题型来加深印象和练手! 前言 逆序字符串和字符串的逆序输出,可能经常会有人混淆,所以今天带大家一起来看一看吧! 一.字符串的逆序 字符串的逆序输出是什么? 逆序字符串:针对一个输入的字符串数组,通过逆序,将其数组内容进行翻转逆序. 字符串的逆序输出:对于一个字符串,只需要数组创建,然后求出字符串的长度,从字符串数组最后一个元素依次输出,直到第一

  • C/C++ 实现递归和栈逆序字符串的实例

    C/C++ 实现递归和栈逆序字符串的实例 递归函数调用模型 逆序方法 void revers(char *buf){ char *p = buf; if (p == NULL) { return; } //递归结束条件 if (*p == '\0') { return; } //递归调用 revers(p + 1); //在字符串的结尾追加n个字符 strncat(buf_g, p, 1); } 调用 int main(int argc, const char * argv[]) { char

  • C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef int ElemType; typedef struct Node {//结点结构 ElemType value; //值域 struct Node *next;//指

  • python反转(逆序)字符串的6种方法详细

    对于一个给定的字符串,逆序输出,这个任务对于python来说是一种很简单的操作,毕竟强大的列表和字符串处理的一些列函数足以应付这些问题 了,今天总结了一下python中对于字符串的逆序输出的几种常用的方法 方法一:直接使用字符串切片功能逆转字符串 >>> def strReverse(strDemo): return strDemo[::-1] >>> print(strReverse('jb51.net')) ten.15bj 结果: ten.15bj 方法二:遍历构

  • C语言 数据结构与算法之字符串详解

    目录 串的定义 串的比较 串的抽象数据类型 串的初始化 相关定义初始化 定长类初始化 串的堆式顺序存储结构(Heap) 初始化堆字符串 赋值操作 比较两个堆字符串的大小 串的定义 零个或多个字符组成的有限序列 串的比较 串的比较实际上是在比较串中字符的编码 存在某个k < min(n,m),使得ai = bi (i = 1,2,3,4..k) 如果 ak < bk  -->  那么srt1 < srt2 (反之也成立) 除去相等的字符,在第一个不相等的字符位置以Ascii码进行比较

  • C语言数学问题与简单DP背包问题详解

    目录 数学 买不到的数目 蚂蚁感冒 饮料换购 简单DP 背包问题 二维 一维 数学 顾名思义,数学类的题就是都可以用数学知识求解. 买不到的数目 这是第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAC组的一道题 小明开了一家糖果店. 他别出心裁:把水果糖包成4颗一包和7颗一包的两种. 糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合. 当然有些糖果数目是无法组合出来的,比如要买 10 颗糖. 你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17. 大于17的任何数字

随机推荐