返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言指针如何实现字符串逆序反转
  • 906
分享到

C语言指针如何实现字符串逆序反转

2024-04-02 19:04:59 906人浏览 泡泡鱼
摘要

目录指针实现字符串逆序反转知识点字符串逆序的几种写法非递归写法递归写法指针实现字符串逆序反转 #include<stdio.h> #include<string.h

指针实现字符串逆序反转

#include<stdio.h>
#include<string.h> 
 
void rec(char* arr)
{
	//int len = sizeof(arr);  // 判断字符串长度需要用strlen。
	int len = strlen(arr);
	printf("字符串长度len = %d\n", len);
	char* p1 = arr;
	char* p2 = &arr[len - 1];
	while (p1 < p2)
	{
		char temp = *p1;
		*p1 = *p2;
		*p2 = temp;
		p1++;
		p2--;
	}
}
 
int main()
{
	char arr[] = "hello world";
	rec(arr); 
	printf("逆序之后输出为:%s\n", arr);
	system("pause");
	return 0;
}

知识点

  • 判断字符串长度需要用到string.h下的strlen函数方法。
  • 算法层面:

逆序就是头尾逐位交换,所以选定两个指针,一个在首,一个在尾。

指针可以直接比较大小。所以才有了while(p1<p2)来将算法执行的终点找到。

  • 因为传入函数方法rec的是地址,所以可以直接修改了原始数据。为了如果为了保护原始数据,需要复制一份另用。

字符串逆序的几种写法

提示:将字符串逆序与将其逆序打印出来是两码事,逆序是将内容倒着改变了,逆序打印虽然打印结果也是倒着的,不过储存字符串的数组内容并没有改变。

非递归写法

1. 将一个给定的字符串abcdef逆序

#include <stdio.h>
int main()
{
	char arr[] = "abcdef";
	int sz = sizeof(arr) / sizeof(arr[0]); //求的是数组包含的元素个数,'\0'也包括在内
	int left = 0;
	int right = sz - 2;   //减2是因为求得的sz包含了'\0'这个元素。
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
	printf("%s", arr);
	return 0;
}

打印结果为fedcba。

逆序思路为:将一字符串最左端与最右端的字符交换,交换过后,通过数组下标将左边第二个字符与右边第二个字符交换,依次类推,知道数组下标通过left++与right–,使得left>=right。

2. 自己输入一串字符串,将其逆序

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[101] = { 0 };     //要给字符数组一定的内存大小,如果写成char arr[] = { 0 };,当在给数组输入的时候就会造成越界访问。
	scanf("%s", arr);
	int sz = strlen(arr);    //在给定字符数组的大小为101的情况下,只能用strlen求输入字符串长度。
                           //用sizeof(arr)/sizeof(arr[0])求出来的是数组大小,为101。
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
	printf("%s", arr);
	return 0;
}

随便输入一串字符,例如:12345gf,打印结果为fg54321。

注意:对于自己给数组输入数据,再将其逆序这种情况下,在定义数组时,要给字符数组一定的内存大小。如果写成char arr[] = { 0 };,说明这个数组的容量只有一个字节,只能输入一个字符,当在给数组输入的时候就会造成越界访问。

3. 将逆序封装成函数

#include <stdio.h>
#include <string.h>
void reverse(char arr[])
{
	
	int left = 0;
	int right = strlen(arr) - 1;      //封装成函数只能用库函数求字符串长度,不能用sizeof(arr)/sizeof(arr[0])-1这种方式。
                                    //因为数组形参就是个地址。sizeof(arr)与sizeof(arr[0])的大小都是四个字节或者八个字节。
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdef";
	reverse(arr);
	printf("%s", arr);
	return 0;
}

与sizeof 两者用来求字符串长度时的场合区别。

这里值得注意的是,在自定义函数中求字符串长度时,不要用sizeof(arr)/sizeof(arr[0])-1这种方式。直接使用库函数 strlen。因为数组在传参的时候,传过去的是数组首元素的地址,也就是说形参虽说写的是数组的形式char arr[],但是形参其实是个指针变量char*。

对于指针变量来说,其大小根据编译器环境,都是四个字节或者都是八个字节。sizeof运算符就是获取数据类型和表达式的尺寸的(单位:字节)。sizeof(arr)与sizeof(arr[0])的大小都是四个字节或者八个字节。

所以sizeof(arr)/sizeof(arr[0])-1=4/4-1=0,或者8/8-1=0。

递归写法

1. 方法一

#include <stdio.h>
#include <string.h>
void reverse(char str[])  //用数组接收实参,也可用指针接收实参,如void reverse(char* str) 
{
	char tmp = *str;
	int len = strlen(str);
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';
	if (strlen(str + 1) >= 2)  //首尾交换后,剩下的元素构成的数组,长度要大于1,才逆序,只剩下一个元素,表明其是最中间的元素,放在原位就好。
	{
		reverse(str + 1);
	}
	*(str + len - 1) = tmp;
}
int main()
{
	char arr[101] = { 0 };
	scanf("%s", arr);
	reverse(arr);
	printf("%s\n", arr);
	return 0;
}

思路:假设一个数组有 n 个元素。

交换str[0]与 str[n-1],再逆序 str[1] 与 str[n-2]

交换 str[1] 与 str[n-2],再逆序 str[2] 与 str[n-3]。依次类推

······

操作步骤:

  • 1.先将第一个字符,即 str[0] 位置上的字符放在一个临时变量中。
  • 2.将最后一个元素交换到 str[0] 的位置去。
  • 3.将字符串中的’\0’放到arr[n-1] 的位置上去。
  • 4.此时从 str[1] 到 str[n-2] 的角度上看,是一个新的字符串,将 str[1] 与 str[n-2] 交换。
  • 5.将先前放在临时变量中的第一个字符赋给 arr[n-1] 的位置上去。

注意:在第三步并没有将放在临时变量中的第一个字符直接往 str[n-1]上放,而是经过第四步,将str[1] 与 str[n-2] 交换后,才将之前未交换完的第一个字符放到 str[n-1] 上去。原因:如果直接将 str[0] 与 str[n-1] 上的元素通过一个临时变量交换了。那么对于即将要交换的 str[1] 与 str[n-2] 来说,他们与’\0’之间隔了一个放在str[n-1]上的第一个字符,str[1] 与 str[n-2] 也就无法通过首尾字符直接交换的方式进行交换了 。

逆序a b c d e f 等于交换 a与f ,再逆序b c d e

逆序b c d e 等于交换b与e,再逆序c d。依次类推。

2. 方法二

#include <stdio.h>
#include <string.h>
void reverse(char str[], int left, int right)
{
	if (left < right)
	{
		char tmp = str[left];
		str[left] = str[right];
		str[right] = tmp;
		reverse(str, left + 1, right - 1);
	}
}
int main()
{
	char arr[101] = { 0 };
	scanf("%s", arr);
	int left = 0;
	int right = strlen(arr) - 1;
	reverse(arr, left, right);
	printf("%s\n", arr);
	return 0;
}

方法二比方法一传的参数要多,直接将首尾字符通过第三个临时变量进行交换就行。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: C语言指针如何实现字符串逆序反转

本文链接: https://lsjlt.com/news/164791.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言指针如何实现字符串逆序反转
    目录指针实现字符串逆序反转知识点字符串逆序的几种写法非递归写法递归写法指针实现字符串逆序反转 #include<stdio.h> #include<string.h...
    99+
    2024-04-02
  • c语言中如何实现逆序字符串
    这篇文章主要介绍了c语言中如何实现逆序字符串,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用指针逆序字符串思路:给两个指针,left放在字符串左侧,right放在最后一个有...
    99+
    2023-06-26
  • c语言如何实现字符串反转
    C语言可以通过循环遍历字符串并交换字符的位置来实现字符串的反转。具体步骤如下:1. 首先,定义一个指向字符串的指针。2. 使用`st...
    99+
    2023-09-12
    c语言
  • 如何使用C语言实现字符串逆序
    本篇内容介绍了“如何使用C语言实现字符串逆序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!编写一个函数 r...
    99+
    2024-04-02
  • C语言中字符串反转怎么实现
    这篇文章主要介绍C语言中字符串反转怎么实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码实现#include <stdio.h>#include <string.h>#...
    99+
    2023-06-25
  • C语言指针怎么实现数组逆序
    可以通过指针来实现数组逆序。下面是一个示例代码:```c#include void reverseArray(int *arr, i...
    99+
    2023-09-14
    C语言
  • c语言指针怎么实现字符串拷贝
    在C语言中,可以使用指针来实现字符串拷贝。以下是一种常见的方法: #include void stringCopy(char *...
    99+
    2023-10-27
    c语言
  • 使用C语言实现字符串逆序操作案例
    编写一个函数 reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数。 非递归实现: #inc...
    99+
    2024-04-02
  • C语言递归实现字符串逆序的方式详解
    C语言实现字符串逆序,具体内容如下所示: 一、迭代的方式实现 贴上代码:迭代的方式实现 '//字符串逆序:不可用字符串操作函数' #include <stdio.h&g...
    99+
    2024-04-02
  • c语言中递归字符串逆序输出怎么实现
    要实现递归字符串逆序输出,可以按照以下步骤进行:1. 定义一个递归函数,该函数接受一个字符串作为参数。2. 在递归函数中,首先判断字...
    99+
    2023-08-24
    c语言
  • C语言 分析逆序字符串与字符串的逆序输出有什么区别
    目录前言一、字符串的逆序二、实例讲解1.字符串的逆序输出2.逆序字符串3.综合实例总结今天我们讲解字符串的逆序和逆序输出,并且通过一个综合题型来加深印象和练手! 前言 逆序字符串和字...
    99+
    2024-04-02
  • c语言怎么反转输出字符串
    c语言中,反转字符串有三种方法:使用字符串数组、使用指针以及使用库函数 strrev。 如何使用 C 语言反转输出字符串 开门见山:C 语言可以通过多种方法反转字符串,最常见的方法是使...
    99+
    2024-05-21
    c语言 字符串数组
  • javascript如何实现反转字符串
    这篇文章将为大家详细讲解有关javascript如何实现反转字符串,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。javascript实现反转字符串的方法:1...
    99+
    2024-04-02
  • java如何实现字符串反转
    Java中可以使用StringBuilder或StringBuffer类的reverse()方法来实现字符串反转。 以下是...
    99+
    2023-10-22
    java
  • es6如何实现字符串反转
    本篇内容介绍了“es6如何实现字符串反转”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现方法:1、用split、reverse和join函...
    99+
    2023-07-04
  • c++字符串逆序输出怎么实现
    有多种方法可以实现C++字符串的逆序输出,以下是两种常见的方法: 方法一:使用循环逆序输出 #include #include ...
    99+
    2023-10-25
    c++
  • c语言字符串转数字怎么实现
    在C语言中,可以使用标准库函数atoi()和atol()来将字符串转换为整数和长整数。具体实现如下: #include <st...
    99+
    2024-03-08
    c语言
  • c语言中字符串变量如何用指针指向第一位
    通过指针指向 c 语言字符串变量的第一位步骤如下:声明一个字符指针变量。将指针变量赋值为字符串变量的地址,可以使用取地址运算符 (&)。 如何用指针指向 C 语言字符串变量的第...
    99+
    2024-05-22
    c语言
  • C语言每日练习之字符串反转
    目录分析代码实现网上参考总结分析 在第18天:利用递归函数调用方式,将所输入的字符以相反顺序打印出来中,已经用过递归实现字符顺序输入,逆序输出,今天的题目是字符串反转,将以字符数组的...
    99+
    2024-04-02
  • delphi字符串如何转化为指针
    在Delphi中,可以使用PChar类型来表示字符串的指针。要将一个字符串转换为指针,可以使用StrPCopy函数或者使用字符串变量...
    99+
    2023-09-16
    delphi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作