一、题目来源
字符逆序__牛客网 (nowcoder.com)
二、题目介绍
将一个字符串str的内容颠倒过来,并输出。
三、思路分析
- 要将字符串str存储起来,可以使用字符数组或者字符指针的方式存储起来;
- 从题目中我们知道该题需要我们自己输入字符串,并且字符串中间还要有空格,所以,我们不能使用scanf输入字符串,需要使用fgets函数来实现字符串的输入;
- 需要获得字符串的长度,在C语言中,可以使用strlen函数,不过使用记得包含头文件<string.h>
- 创建一个函数con来实现字符串逆序的操作;
- 实现逆序的操作:使用循环或者使用指针。
四:知识介绍
1. 字符串存储方式
1 使用字符数组:
char str[8000];//[字符个数]
2 使用字符指针:
char* str; int size = 0; //size指输入字符的最大数
2、strlen
strlen是用来计算字符串长度的,返回值是size_t
3. 字符串的输入
1 使用scanf输入:
char str[8000];//[字符个数] scanf("%s\n",str)//这里不用&是因为数组名是首元素地址
2 使用fgets函数输入:
fgets函数用于从指定的文件流中读取一行字符串。
函数原型:char *fgets(char *str, int n, FILE *stream);
参数介绍:
- str:指向要存储读取字符串的字符数组。
- n:指定读取的最大字符数(包括字符串结束符
'\0'
)。- stream:指定要读取的文件流,通常使用 stdin 表示标准输入(即键盘输入)。
注意事项:
- 由于 fgets会保留换行符,如果后续处理不需要换行符,可以手动去除。
- 要确保提供的字符数组 str 有足够的空间来存储读取的字符串,以避免缓冲区溢出。
代码演示:
fgets(str, n, stdin); size_t len = strlen(str); //检查字符串末尾的字符(即下标为 len - 1 的字符)是否为换行符。 //如果是的话,就将它替换为\0 if (str[len - 1] == '\n') { str[len - 1] = '\0'; }
五、逐步实现
1.字符串在内存的存储与输入:
字符数组:
char str[8000];
fgets(str, 8000, stdin);
size_t len = strlen(str);
if (str[len - 1] == '\n')
{
str[len - 1] = '\0';
}
注意:这里8000是为了能够确保提供的字符数组 str 有足够的空间来存储读取的字符串
关于字符指针这个方法后面再说,今天这道题存储和输入就使用字符数组吧!
2.获取字符串长度
size_t len = strlen(str)
3.调用函数con
cont(str,len);
两个参数:str数组名,len字符串长度
void cont(char* str, size_t len) //指针接收
4.字符串逆序实现
1.使用for循环
for (int i = len - 1; i >= 0; i--)//从后向前打印每一个字符串
{
printf("%c", str[i]);
}
2.使用while实现
char* begin = str;
char* end = str + strlen(str) - 1;
while (begin < end)
{
char temp = *begin;
*begin = *end;
*end = temp;
begin++;
end--;
}
六、函数实现
1. main函数
int main()
{
char str[8000];
fgets(str, 8000, stdin);
size_t len = strlen(str);
if (str[len - 1] == '\n')
{
str[len - 1] = '\0';
}
cont(str,len);
printf("%s\n", str);
return 0;
}
2. con函数
法1:
void cont(char* str,size_t len)
{
//size_t len = strlen(str);
for (int i = len - 1; i >= 0; i--)
{
printf("%c", str[i]);
}
}
法2:
void cont(char* str, size_t len)
{
char* begin = str;
char* end = str + strlen(str) - 1;
while (begin < end)
{
char temp = *begin;
*begin = *end;
*end = temp;
begin++;
end--;
}
}
七、完整代码
第一种:
#include <stdio.h>
#include <string.h>
void cont(char* str,size_t len)
{
//size_t len = strlen(str);
for (int i = len - 1; i >= 0; i--)
{
printf("%c", str[i]);
}
}
int main()
{
char str[8000];
fgets(str, 8000, stdin);
size_t len = strlen(str);
if (str[len - 1] == '\n')
{
str[len - 1] = '\0';
}
cont(str,len);
return 0;
}
第二种:
#include <stdio.h>
#include <string.h>
void cont(char* str, size_t len)
{
char* begin = str;
char* end = str + strlen(str) - 1;
while (begin < end)
{
char temp = *begin;
*begin = *end;
*end = temp;
begin++;
end--;
}
}
int main()
{
char str[8000];
fgets(str, 8000, stdin);
size_t len = strlen(str);
if (str[len - 1] == '\n')
{
str[len - 1] = '\0';
}
cont(str,len);
printf("%s\n", str);
return 0;
}
结果展示:
八、一些闲话
标题名称虽然是每日一题,但是有时候小编虽然题目写了,但是没有整理,就来不及发文章了,所以没法做到每日一篇,还请见谅!下期再见!!!