题目:实现字符串逆序
实现 - 将参数字符串中的字符反向排列,注意:并非逆序打印
要求 - 不能使用C函数库中的字符串操作函数如:strlen()
一、预览效果
- 主页面

- 任意输入一串字符

二、实现自己的strlen函数
由于要求:不能使用C函数库中的字符串操作函数,因此我们可自行编写一个函数my_strlen()来统计字符串的长度。将上述中strlen()更换为my_strlen()即可。
拓展:
strlen是一个库函数,需要引用头文件#include <string.h> ,是专门求字符串长度的,只能针对字符串,返回的是字符串的实际长度,从参数给定的地址向后一直找'\0',即统计'\0'之前出现的字符的个数。
sizeof是C语言中的一个单目运算符,是用来计算变量(类型)所占内存空间的大小,不关注内存中存放的具体内容,单位为字节,即包括'\0'在内。
实现代码如下
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
三、实现方法
1.迭代
即使用循环的方法
实现代码如下:
int reverse(char str[])
{
char temp = 0;
int left = 0;
int right = my_strlen(str) - 1;
while (left < right)
{
temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
}
int main()
{
char str[20];
printf("请输入字符串:>");
scanf("%s", str);
//int sz = sizeof(str) / sizeof(str[0]); - 求数组长度,只适用于已定义的数组
reverse(str);
printf("逆序的字符串:>%s\n", str);
return 0;
}
2.递归
①数组(易理解)
将字符串数组、数组首下标,数组尾下标传入函数reverse_string,直接将首尾字符交换,随即限制一个递归条件,从两头往中间交换。
实现代码如下:
int reverse_string(char str[], int left, int right)
{
if (left < right)
{
char temp = str[left];
str[left] = str[right];
str[right] = temp;
reverse_string(str, left + 1, right - 1);
}
}
int main()
{
char str[20];
printf("请输入字符串:>");
scanf("%s", str);
int left = 0;
int right = my_strlen(str) - 1;
reverse_string(str, left, right);
printf("逆序的字符串:>%s\n", str);
return 0;
}
②指针(较难理解)
步骤:
1.将第一个字符拿给temp
2.将最后一个字符拿到第一个字符
3.将最后一个字符的位置添上一个’\0’使得中间未经更改的字符变为一个字符串
4.将中间这个字符串(不包含’\0’)逆序
5.将第三步的’\0’处,即最后一个字符赋值为第一个字符(temp)
实现代码如下:
int reverse_string(char* str)
{
char temp = *str; //1
int len = my_strlen(str);
*str = *(str + len - 1); //2
*(str + len - 1) = '\0'; //3
if (my_strlen(str + 1) >= 2) //终止递归,如果仅有一个字符就停止递归
{
reverse_string(str + 1);//4
}
*(str + len - 1) = temp; //5
}
int main()
{
char str[20];
printf("请输入字符串:>");
scanf("%s", str);
//int sz = sizeof(str) / sizeof(str[0]); - 求数组长度,只适用于已定义的数组
reverse_string(str);
printf("逆序的字符串:>%s\n", str);
return 0;
}
本文介绍了如何在C语言中,不使用内置的strlen函数,通过迭代和递归两种方法实现字符串逆序,包括使用数组和指针的实现细节以及示例代码。

1万+

被折叠的 条评论
为什么被折叠?



