牛客网学习之倒置字符串(详解fgets函数,如何读取含有空格的字符串)

简介: 牛客网学习之倒置字符串(详解fgets函数,如何读取含有空格的字符串)

题目要求:

过程分析:(大致思路)

具体代码:

#include <stdio.h>
#include <string.h>
/*逆序字符串*/
void reverse(char* begin,char* end)
{
  while (begin < end)
  {
    char temp = *begin;
    *begin = *end;
    *end = temp;
    begin++;
    end--;
  }
}
int main()
{
  char arr[101];
  fgets(arr, 101, stdin);
  int len = strlen(arr);
  arr[len - 1] = '\0';//注意,fgets函数在读取时会把\n也存到字符串中
            //要把最后一个字符改为\0
  /*实现倒置字符串*/
  reverse(arr, arr + len - 2);
  /*实现每个单词的逆序*/
  char* start = arr;//存储每个单词的首地址
  char* cur = arr;//用于存储当前的地址
  while (*cur)
  {
    while (*cur != ' ' && *cur!='\0')
    {
      cur++;//最后cur会指向空格(最后一个单词会指向\0)
    }
    reverse(start, cur - 1);
    start = cur + 1;
    if (*cur == ' ')//若*cur在等于\0之后再++,他会指向一个随机值,从而使循环继续
    {
      cur++;//使其指向下一个单词的首地址
    }
  }
  printf("%s", arr);
  return 0;
}

注意:本题作者在一开始使用了scanf函数来读取字符串,忘记了scanf函数读取到空格就会自动结束读取字符串了,导致接下来如何编写都无法得到正确答案,吃了基础不牢的亏,希望大家引以为鉴;

那么,在无法使用scanf函数来读取含有空格的字符串的情况下,我们又可以使用哪些方法呢?下面作者将讲述三个方法;

1.fgets函数(重点讲解)

原型:

观察fgets函数,我们可知他与scanf函数最大的不同在于fgets函数会将字符串的结束标志'\0'也作为一个元素存储到数组str中!在倒置字符串的代码中,就有对这一情况的一个解决方案。

2.使用scanf("%[^\n]s", arr)函数

       可以理解为是scanf函数的一个优化版本,使scanf能够读取含有空格的字符串。

在倒置字符串代码中使用scanf("%[^\n]s",arr);函数

 

3.gets或gets_s函数

       很多人的第一想法可能是gets函数,因为这是我们在初学C语言时经常用到的函数,可在C99标准下,这个函数因为安全问题已经被废弃,在一些较老的编译器下可能还能使用,但大多编译器已经无法使用,所以这个方法适用范围太窄,建议大家以后不要再使用此函数。

目录
相关文章
|
机器学习/深度学习
大模型开发:解释正则化及其在机器学习中的作用。
正则化是防止机器学习过拟合的技术,通过限制模型参数和控制复杂度避免过拟合。它包含L1和L2正则化,前者产生稀疏解,后者适度缩小参数。选择合适的正则化方法和强度对模型性能关键,常用交叉验证评估。
439 1
|
人工智能 算法 决策智能
【五子棋实战】第2章 博弈树负值极大alpha-beta剪枝算法(一)
市面上比较常用的五子棋算法是博弈树极大极小值alpha-beta剪枝算法,该算法可以分成四个部分来讲解,它们是环环相扣的:博弈树 - 极大极小值搜索 - 负值极大法 - alpha&beta剪枝 。
867 0
|
12月前
|
Python 机器学习/深度学习 人工智能
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣
【10月更文挑战第1天】本文通过构建一个简单的强化学习环境,演示了如何创建和训练智能体以完成特定任务。我们使用Python、OpenAI Gym和PyTorch搭建了一个基础的智能体,使其学会在CartPole-v1环境中保持杆子不倒。文中详细介绍了环境设置、神经网络构建及训练过程。此实战案例有助于理解智能体的工作原理及基本训练方法,为更复杂应用奠定基础。首先需安装必要库: ```bash pip install gym torch ``` 接着定义环境并与之交互,实现智能体的训练。通过多个回合的试错学习,智能体逐步优化其策略。这一过程虽从基础做起,但为后续研究提供了良好起点。
1552 4
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣
|
11月前
|
大数据
【赵渝强老师】大数据主从架构的单点故障
大数据体系架构中,核心组件采用主从架构,存在单点故障问题。为提高系统可用性,需实现高可用(HA)架构,通常借助ZooKeeper来实现。ZooKeeper提供配置维护、分布式同步等功能,确保集群稳定运行。下图展示了基于ZooKeeper的HDFS HA架构。
217 0
|
JavaScript
Vue项目如何生成树形目录结构
这篇文章介绍了如何在Vue项目中生成树形目录结构,通过安装并使用`mddir`命令行工具来创建一个`directoryList.md`文件,从而快速获取项目的树形目录列表。
Vue项目如何生成树形目录结构
|
存储
Postman 接口测试配置 Pre-request Script
Postman 接口测试配置 Pre-request Script
518 5
Postman 接口测试配置 Pre-request Script
|
运维 持续交付 Docker
在Docker中,Docker可以用来做什么?
在Docker中,Docker可以用来做什么?
|
机器学习/深度学习 算法 自动驾驶
基于Qlearning强化学习的路径规划算法matlab仿真
基于Qlearning强化学习的路径规划算法matlab仿真
|
开发框架 监控 Kubernetes
CTF本地靶场搭建——GZ:CTF基础使用
GZ::CTF是一个基于ASP.NET Core的开源CTF竞赛平台,支持Docker或K8s容器部署,提供静态和动态题目类型,包括静态附件、动态附件、静态容器和动态容器,具备动态分值功能,如三血奖励和动态flag作弊检测。平台还具有实时通知、邮件验证、用户权限管理、Writeup收集、流量代理转发等功能。此外,它包含比赛管理、队伍管理、用户管理等多个管理模块,适合举办和参与网络安全竞赛。
|
存储 Shell Linux
ZooKeeper【部署 01】单机版安装+配置+添加到service服务+开机启动配置+验证+chkconfig配置+shell自动部署脚本(一篇入门zookeeper)
ZooKeeper【部署 01】单机版安装+配置+添加到service服务+开机启动配置+验证+chkconfig配置+shell自动部署脚本(一篇入门zookeeper)
1111 0