C语言(字符串输入)

news2024/11/30 6:46:40

目录

一.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';

        else

            while (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',就直接结束了。这时候输入缓冲区所有字符都被清空了


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习笔记:文件

因为有的数据&#xff0c;数据量极大。或者是你想把编译输出的内容存储起来&#xff0c;就可以使用文件 读文件中内容具体操作 来自C语言详解 FILE文件操作 - 知乎 (zhihu.com) 写入文件具体操作 同样来自 C语言详解 FILE文件操作 - 知乎 (zhihu.com) 当文件关闭时&#xff0c…

sql手工注入dvwa靶场

sql手工注入dvwa靶场 记录一下自己重新开始学习web安全之路④。 一、找交互点&#xff08;url、搜索框、登录框&#xff09; 在dvwa靶场中&#xff0c;发现有url&#xff0c;有搜索框。 二、找注入点&#xff08;通过 ’ 号来判断&#xff09; 思考一&#xff1a;为什么能通…

响应式圣经:10W字,实现Spring响应式编程自由

前言 全链路异步化改造的基础是响应式编程 随着业务的发展&#xff0c;微服务应用的流量越来越大&#xff0c;使用到的资源也越来越多。 在微服务架构下&#xff0c;大量的应用都是 SpringCloud 分布式架构&#xff0c;这种架构总体上是全链路同步模式。 全链路同步模式不仅…

膳食锌缺乏或过量对人体肠道菌群及健康的影响

谷禾健康 锌与肠道微生物 锌(Zn)是人体必需的微量元素&#xff0c;是人体中第二丰富的矿物质。锌在细胞和器官功能中起着关键的催化、调节和结构作用。 ★ 膳食锌缺乏或过量均不健康 锌缺乏与发育不良、免疫功能低下、味觉丧失、不良妊娠结局、脱发、皮肤损伤和神经行为异常有关…

数据结构 | 树 | 二叉树

&#x1f525;Go for it!&#x1f525; &#x1f4dd;个人主页&#xff1a;按键难防 &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f4d6;系列专栏&#xff1a;数据结构与算法 &#x1f52…

windows本地开发Spark[不开虚拟机]

1. windows本地安装hadoop hadoop 官网下载 hadoop2.9.1版本 1.1 解压缩至C:\XX\XX\hadoop-2.9.1 1.2 下载动态链接库和工具库 1.3 将文件winutils.exe放在目录C:\XX\XX\hadoop-2.9.1\bin下 1.4 将文件hadoop.dll放在目录C:\XX\XX\hadoop-2.9.1\bin下 1.5 将文件hadoop.dl…

Redis学习【5】之集合的底层实现原理

文章目录一 集合的底层实现原理1.1 两种实现的选择1.2 zipList【存在于Redis7.0之前的版本】1.3 listPack【Redis7.0中zipList的改进版】1.4 skipList1.4.1 skipList 原理1.4.2 skipList存在的问题与优化1.5 quickList1.5.1 quitList检索操作1.5.2 quitList插入操作1.5.3 quitL…

知识图谱概述

知识图谱 知识图谱本质上是一种大规模的语义网络&#xff0c;富含实体、概念及其之间的各种语义关系。 作为一种语义网络是大数据时代知识表示的重要方式之一。 作为一种技术体系&#xff0c;是大数据时代知识工程代表性进展。 领域知识图谱 领 域&#xff08;行业&#xf…

一篇文章带你熟练使用Ansible中的playbook

目录 一、Playbook的功能 二、YAML 1、简介 2、特点 3、语法简介 4、YAML 列表 5、YAML的字典 三、playbook执行命令 四、 Playbook的核心组件 五、vim 设定技巧 练习 一、Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 二、…

Mysql5.7安装【Windows版】

文章目录一、下载二、添加到环境变量三、添加配置文件my.ini四、安装Mysql 修改密码一、下载 下载地址 滑倒最下面有一个MySQL Community Server 选择要下载的版本 二、添加到环境变量 下载好了之后开始解压 把bin目录添加到环境变量 可以点击进入bin目录&#xff0c;直接复…

低代码平台真的是企业的福音吗?

研究低代码平台已有3年&#xff0c;也算是个低代码资深用户了&#xff0c;下面基于个人理解给大家做一份2k字的深入介绍&#xff01;希望对大家在低代码方面有一定帮助。 开篇&#xff0c;先带大家来看企业为什么要布局低代码平台&#xff01;究竟有何优势&#xff1f; &…

认识钉钉小程序_搭建一个简单的小程序---钉钉小程序开发教程001

其实这里面开发的时候具体,应该有很多的坑,不过..因为暂时不需要具体做,我仅仅查了一下怎么做,记录一下,以后不用再查了. 感觉钉钉小程序开发比微信小程序开发要更便捷,简单一些.首先要注册一个开发者,其实登录上钉钉账号就可以了.然后可以看看,快速入门,我没看 然后下载开发工…

Java基础之多线程JUC全面学习笔记

目录初识多线程多线程的实现方式常见的成员方法线程安全的问题死锁生产者和消费者线程池自定义线程池初识多线程 什么是多线程? 线程 线程是操作系统能够进行运算调度的最小单位。线程被包含在进程之中&#xff0c;是进程中的实际运作单位。 简单理解:应用软件中互相独立&…

为什么西门子、美的等企业这样进行架构升级,看看改造效果就知道了

在工业领域&#xff0c; 生产、测试、运行阶段都可能会产生大量带有时间戳的传感器数据&#xff0c;这都属于典型的时序数据。时序数据主要由各类型实时监测、检查与分析设备所采集或产生&#xff0c;涉及制造、电力、化工、工程作业等多个行业&#xff0c;具备写多读少、量非常…

从端到端打通模型端侧部署流程(NCNN)

文章目录背景介绍&#xff1a;为什么要做端侧推理&#xff1a;端侧深度学习部署流程&#xff1a;一条主要技术路线&#xff1a;ONNX&#xff1a;NCNN框架&#xff1a;NCNN的官方介绍&#xff1a;NCNN问题解决&#xff1a;NCNN使用样例快速在NCNN框架下验证自己的模型&#xff1…

数据分析思维(六)|循环/闭环思维

循环/闭环思维 1、概念 在很多的分析场景下&#xff0c;我们需要按照一套流程反复分析&#xff0c;而不是进行一次性的分析&#xff0c;也就是说这套流程的结果会成为该流程的新一次输入&#xff0c;从而形成一个闭环&#xff0c;此时的分析思维我们称之为循环/闭环思维。 常…

计算机断层扫描结肠镜和全自动骨密度仪在一次检查中的可行性

计算机断层扫描结肠镜和全自动骨密度仪在一次检查中的可行性 Feasibility of Simultaneous Computed Tomographic Colonography and Fully Automated Bone Mineral Densitometry in a Single Examination 简单总结&#xff1a; 数据&#xff1a;患者的结肠镜检查和腹部CT检查…

2022黑马Redis跟学笔记.实战篇(三)

2022黑马Redis跟学笔记.实战篇 三4.2.商家查询的缓存功能4.3.1.认识缓存4.3.1.1.什么是缓存4.3.1.2.缓存的作用1.为什么要使用缓存2.如何使用缓存3. 添加商户缓存4. 缓存模型和思路4.3.1.3.缓存的成本4.3.2.添加redis缓存4.3.3.缓存更新策略4.3.3.1.三种策略(1).内存淘汰:Redis…

NoSQL和Redis

NoSQL一、NoSqlNoSQL Not Only SQL(不仅仅是SQL)非关系型数据库二、为什么需要NoSQL1、web1.0在90年代&#xff0c;一个网站的访问量一般都不大&#xff0c;用单个数据库完全可以轻松应付。在那个时候&#xff0c;更多的都是静态网页&#xff0c;动态交互类型的网站不多。单机…

CS224W课程学习笔记(一):课程介绍与图深度学习概念

引言 我们从怎么利用图形或网络表示数据这一动机开始。网络成为了用于描述复杂系统中交互实体的通用语言。从图片上讲&#xff0c;与其认为我们的数据集由一组孤立的数据点组成&#xff0c;不如考虑这些点之间的相互作用和关系。 在不同种类的网络之间进行哲学上的区分是有启…