C:每日一题:逆序字符串(牛客)

一、题目来源

字符逆序__牛客网 (nowcoder.com)

二、题目介绍

将一个字符串str的内容颠倒过来,并输出。

三、思路分析

  1. 要将字符串str存储起来,可以使用字符数组或者字符指针的方式存储起来;
  2. 从题目中我们知道该题需要我们自己输入字符串,并且字符串中间还要有空格,所以,我们不能使用scanf输入字符串,需要使用fgets函数来实现字符串的输入;
  3. 需要获得字符串的长度,在C语言中,可以使用strlen函数,不过使用记得包含头文件<string.h>
  4. 创建一个函数con来实现字符串逆序的操作;
  5. 实现逆序的操作:使用循环或者使用指针。

四:知识介绍

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;
}

结果展示:

 

八、一些闲话 

标题名称虽然是每日一题,但是有时候小编虽然题目写了,但是没有整理,就来不及发文章了,所以没法做到每日一篇,还请见谅!下期再见!!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值