当前位置: 首页 > news >正文

C语言(字符串输入)

目录

一.gets和puts组合

二.fgets()和fputs()

三.fgets()函数返回

四.fgets读取满问题

五.修改fgets函数,自动用'\0'替换'\n'

一.gets和puts组合

Gets()读取整行输入,知道遇到换行符,然后丢弃换行符,存储其余字符,并在这些字符的末尾添加一个空字符使其成为一个C字符串。去'\n'补'\0'

Puts()将地址的字符末尾添加一个换行符后进行打印。补'\n'

使用gets有个比较不好的地方就是它不会检测数组是否能装得下输入行。所以当输入字符串过长后,会导致缓冲区溢出,所以我们用其他办法进行替换

二.fgets()和fputs()

fets()有三个参数,第一个就是存储地址位置,第二个就是读入字符的最大数量,第三个指明读入的文件(如果在屏幕输入用stdin)

fputs()有两个参数,第二个参数指明了要写入数据的文件,如果要打印到屏幕上,用stdout

fgets和gets不同之处在于,fgets会读取换行符,不会丢弃

fputs和puts不同之处在于,fputs不会自动添加换行符

这里可以看到,超出9个字符后,其他字符都会丢弃(fgets最后一个字符一定是空字符)

三.fgets()函数返回

fgets()函数返回指向char的指针。如果一切进行顺利,该函数返回的地址与传入的第一个参数相同。

但是,如果函数读到文件结尾,它将返回一个特殊的指针,空指针(NULL或0),如果在读入数据时出现某些错误,也返回空指针(NULL或0)

四.fgets读取满问题

如果fgets读到第二个参数的最大数字时,还没遇到换行符之前,它就会把数组最后一个设为'\0'。

还是用上面的例子。这里你乍一看可能觉得没问题,但仔细看,fgets第二个参数STLEN为10,但问题是"hello world\n"有12个字符,那它是如何完整把这个打印出来的呢。这里主要依靠while循环不断读取字符串到words数组中,进行完整打印。第一次其实只能装下"hello wor\0",然后进行屏幕打印。但因为fgets还能从输入缓冲区读取字符串,所以继续循环,把"ld\n"读入数组words中。进行打印。下次打印,因为输入缓冲区没有字符了,停止循环。

我们把fputs换成puts你就能很清楚的看到了

系统使用缓冲的I/O,这意味着用户在按下Return键之前,输入都被存储在临时存储区(缓冲区)中。按下Return键就在输入中增加了一个换行符,并把整行输入发送给fgets(),对于输出,fputs()把字符发送给另一个缓冲区,当发送换行符时,缓冲区中的内容被发送至屏幕上

五.修改fgets函数,自动用'\0'替换'\n'

使用fgets函数读取整行输入并用空字符代替换行符,或者读取一部分输入,并丢弃其余部分。

演示代码:
#include <stdio.h>#define CHAR "hello world"char* s_gets(char* st, int n);int main(){char ch[10];s_gets(ch, 10);printf("ch字符串: ");puts(ch);}char* s_gets(char* st, int n) {char* ret_val;int i = 0;ret_val = fgets(st, n, stdin);if (ret_val) {while (st[i] != '\n' && st[i] != '\0') i++;if (st[i] == '\n') st[i] = '\0';elsewhile (getchar() != '\n') continue;}return ret_val;}

注意这里我们用puts但只打印了一个'\n'。这就说明我们输入的'\n'已经被替换成了'\0'

这里我们重点讲解下s_gets函数

char * s_gets(char * st,int n){

    char * ret_val;

    int i = 0;

    ret_val = fgets(st,n,stdin);

    if(ret_val){

        while(st[i] != '\n' && st[i] != '\0') i++;

        if(st[i] == '\n') st[i] = '\0';

        else

            while(getchar() != '\n') continue;

    }

    return ret_val;

}

 ret_val = fgets(st,n,stdin);ret_val主要用于返回输入状态。

while(st[i] != '\n' && st[i] != '\0') i++;一直找到'\n'或'\0'才停止。

如果先找到'\n',将'\n'替换成'\0'。

如果先找到'\0',会自动将输入缓冲区的内容一直清除掉。这里清除掉主要靠

 while(getchar() != '\n') continue;它会一直从输入缓冲区读入数据,只要读入不是'\n'就会继续读入(continue),这里需要知道getchar()只是读值,但并没有将这些值进行写入。就算最后读到'\n',就直接结束了。这时候输入缓冲区所有字符都被清空了


好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~

如果朋友你感觉文章的内容对你有帮助,可以点赞关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈

相关文章:

C语言(字符串输入)

目录 一.gets和puts组合 二.fgets()和fputs() 三.fgets()函数返回 四.fgets读取满问题 五.修改fgets函数,自动用\0替换\n 一.gets和puts组合 Gets()读取整行输入&#xff0c;知道遇到换行符&#xff0c;然后丢弃换行符&#xff0c;存储其余字符&#xff0c;并在这些字符的…...

背包问题求方案数(AcWing)(JAVA)

有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出 最优选法的方案数。注意答案可能很大&#xff0c;请输出答…...

一篇文章带你读懂HashMap

HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一。可见HashMap的掌握是多重要。 一、HashMap源码分析 1、构造函数 让我们先从构造函数说起&#xff0c;HashMap有四个构造方法&#xff0c;别慌 1.1 HashMap() // 1.无参构造方法、// 构造一…...

Java如何进行优雅的判空——Optional类的灵活应用

0 引言 在Java Web项目开发中&#xff0c;经常令人头疼的NPE问题&#xff08;NullPointerException&#xff09;——空指针&#xff0c;例如我们在调用equal()方法时&#xff0c;就经常会出现NPE问题&#xff1a; String str null; str.equals("fsfs")&#xff1b;…...

Fluent Python 笔记 第 12 章 继承的优缺点

重点是说明对 Python 而言尤为重要的两个细节: 子类化内置类型的缺点多重继承和方法解析顺序 12.1 子类化内置类型很麻烦 内置类型(使用 C 语言编写)不会调用用户定义的类覆盖的特殊方法。 不要子类化内置类型&#xff0c;用户自己定义的类应 该继承 collections 模块(http…...

Go语言读取解析yml文件,快速转换yml到go struct

YAML (YAML Aint a Markup Language)是一种标记语言&#xff0c;通常以.yml为后缀的文件&#xff0c;是一种直观的能够被计算机程序识别的数据序列化格式&#xff0c;并且容易被人类阅读&#xff0c;容易和脚本语言交互的&#xff0c;可以被支持YAML库的不同的编程语言程序导入…...

第二十六章 java并发常见知识内容(ThreadLocal 详解)

JAVA重要知识点带着疑问看ThreadLocalGC 之后 key 是否为 null&#xff1f;ThreadLocalMap Hash 算法ThreadLocalMap Hash 冲突ThreadLocalMap.set()方法ThreadLocalMap过期 key 的探测式清理流程ThreadLocalMap扩容机制ThreadLocalMap.get()详解ThreadLocalMap过期 key 的启发…...

人类的第一语言是什么

其实机器智能始终存在一个争议 没有人类的肢体和感受器无法理解和感同身受 这不用想是自然&#xff0c;但是可以通过虚拟数据进行模拟&#xff0c;深度学习便是 深度学习是模拟简单输入输出的最好选择&#xff0c;但不是开放性的学习 没有智能交互的智能永远不是智能 就像狼孩一…...

jsp(全部知识点)

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…...

测试开发面试基础题

1.对测试开发的理解 测试开发首先离不开测试&#xff0c;而软件测试是指&#xff0c;在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程。 而且&#xff0c;现在不仅仅是通过手工测试来发…...

C++——多态|虚函数|重写|虚表

文章目录1. 多态的概念1.1 概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重写虚函数重写的三个例外&#xff1a;2.4 普通调用和多态调用&#xff1a;2.5 C11 override 和 final2.6 重载、虚函数的覆盖(重写)、隐藏(重定义)的对比3. 抽象类(有关纯虚函数)3.1 …...

IPV4地址详解

文章目录IPV4地址分类编址划分子网无分类编制CIDR路由聚合应用规划&#xff08;子网划分的细节&#xff09;定长的子网掩码FLSM变长的子网掩码VLSMIPV4地址 IPV4地址就是给因特网&#xff08;Internet&#xff09;上的每一台主机&#xff08;或路由器&#xff09;的每一个接口…...

(一)初识Streamlit(附安装)

本入门指南介绍Streamlit的工作原理、如何在您首选的操作系统上安装Streamlit&#xff0c;以及如何创建第一个Streamlit应用程序&#xff01; 1 安装 1.1 先决条件 Python 3.7 – Python 3.11 **注&#xff1a;我这里使用的是anaconda的虚拟环境&#xff0c;用pycharm编写代…...

【新】华为OD机试 - 斗地主 2(Python)| 刷完获取OD招聘渠道

斗地主 2 题目描述 在斗地主扑克牌游戏中,扑克牌由小到大的顺序为3 4 5 6 7 8 9 10 J Q K A 2 玩家可以出的扑克牌阵型有,单张,对子,顺子,飞机,炸弹等 其中顺子的出牌规则为,由至少 5 张由小到大连续递增的扑克牌组成 且不能包含2 例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,1…...

秒杀项目之消息推送

目录一、创建消费者二、创建订单链路配置2.1 定义RabbitMQ配置类2.2 创建RabbitmqOrderConfig配置类三、如何实现RabbitMQ重复投递机制3.1 开启发送者消息确认模式3.2 消费发送确认3.2.1 创建ConfirmCallBack确认模式3.2.2 创建ReturnCallBack退回模式3.3 创建生产者3.4 创建消…...

【重磅】IEEE33配电网两阶段鲁棒优化调度CCG

目录 1 前言 2基本内容 2.1 配网两阶段鲁棒模型 2.2 求解步骤 3部分程序 4程序结果 5程序链接 1 前言 鲁棒优化是电力系统研究的热点&#xff0c;而两阶段鲁棒和分布鲁棒研究就成为各类期刊&#xff08;sci/ei/核心&#xff09;的宠儿&#xff0c;最简单的思路是通过改…...

GPT2代码拆解+生成实例

本文代码来自博客&#xff0c;GPT2模型解析参考 import torch import copy import torch.nn as nn import torch.nn.functional as F from torch.nn.modules import ModuleList from torch.nn.modules.normalization import LayerNorm import numpy as np import os from tqd…...

基于android的即时通讯APP 聊天APP

基于android的即时通讯APP 或者 聊天APP 一 项目概述 该项目是基于Android 的聊天APP系统&#xff0c;该APP包含前台&#xff0c;后台管理系统&#xff0c;前台包含用户通讯录,用户详情&#xff0c;用户聊天服务&#xff0c;用户二维码,发现功能,发现详情 , 个人中心, 个人信…...

【C++】二叉树之力扣经典题目1——详解二叉树的递归遍历,二叉树的层次遍历

如有错误&#xff0c;欢迎指正。 如有不理解的地方&#xff0c;可以私信问我。 文章目录题目1&#xff1a;根据二叉树创建字符串题目实例思路与解析代码实现题目2&#xff1a;二叉树的层序遍历题目思路与解析代码实现题目1&#xff1a;根据二叉树创建字符串 点击进入题目链接—…...

MySQL数据库调优————SQL性能分析

TIPS 本文基于MySQL 8.0 本文探讨如何深入SQL内部&#xff0c;去分析其性能&#xff0c;包括了三种方式&#xff1a; SHOW PROFILEINFORMATION_SCHEMA.PROFILINGPERFORMANCE_SCHEMA SHOW PROFILE SHOW PROFILE是MySQL的一个性能分析命令&#xff0c;可以跟踪SQL各种资源消耗。…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...