C语言(字符串输入)

article/2025/11/5 19:24:44

目录

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


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

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


http://chatgpt.dhexx.cn/article/KRYGGUiQ.shtml

相关文章

C语言字符串输入输出总结(一看就懂)

C语言中字符串的使用 java语言中直接就有string这个数据类型&#xff0c;而C语言中没有字符串数据类型&#xff0c;所以使用字符串的时候&#xff0c;难免会不是很方便&#xff0c;那么现在就总结一下C语言中字符串的使用&#xff01; 1.字符串的声明 &#xff08;1&#xf…

String字符串的输入输出

String字符串输入经常会遇到下面的情况&#xff1a; #include<iostream> #include<windows.h> #include<string> using namespace std; int main() {string food;cout << "你喜欢吃什么&#xff1f;" << endl;cin >> food;cout…

c语言字符串输入

如果想把一个字符串读入程序&#xff0c;首先必须预留储存该字符串的空间&#xff0c;然后用输入函数获取该字符串。 分配空间 1.char *name; 2.char name[81]; 1,2 的不同点&#xff1a;1.的指针在未进行初始化之前可能指向任何地方。 2.已分配了81个字节的地址。 char *na…

C语言字符串的输入和输出

文章目录 前言一、使用字符数组二、使用字符数组和字符结合三.字符串处理函数 前言 C语言中没有提供字符串的数据类型&#xff0c;一般用字符数组存储字符串。 如果要输入输出字符串怎么办呢&#xff1f;下面三种方法可供参考。 一、使用字符数组 1.示例&#xff1a; char st…

字符与字符串的输入输出

字符、字符串的输入输出 scanfprintfgetcharscanf与getchar的区别 putchargetsfgetsputscin与coutgetlinecin.getline scanf 不接受空格&#xff0c;回车结束输入 scanf("%c",&a)&#xff1b; 读取标准输入流中的第一个字符&#xff0c;包括空格、换行符等&…

python字符串输出和输入

一、字符串输出 回顾一下以前我们经常写的print()输出数据&#xff0c;输出的就是字符串。下面来看看具体点的代码操作。 代码如下&#xff1a; # 直接输出单引号或双引号或三引号格式字符串 print(hello world)# 2种格式化方法输出字符串 name Python自学网 print(欢迎来到%…

C语言字符串输入及输出的几种方式

1.字符串数组初始化 char s1[]"array"; //字符数组 char s2[6]"array"; //数组长度字符串长度1&#xff0c;因为字符串末尾会自动添‘\0‘ printf("%s,%c\n",s1,s2[2]); //array&#xff0c;r 2.字符串指针初始化 char *sp"pointer&quo…

C++的字符串输入方式

1、cin输入字符串 接收一个字符串&#xff0c;遇到空格和tab键结束接收&#xff0c;回车键表示输入结束&#xff1b;此外定义a[20]&#xff0c;则字符串长度要小于20&#xff0c;最后有个’\0’(否则输入超过20的连续字符串会报错)。 2、cin.get()输入字符 接收第一个字符并赋…

教程篇(7.0) 03. FortiGate安全 防火墙策略 ❀ Fortinet 网络安全专家 NSE 4

在本课中你将了解防火墙策略&#xff0c;以及如何应用它们来允许和拒绝通过FortiGate的流量。FortiGate的核心是一个防火墙&#xff0c;所以它对你的流量所做的几乎所有事情都与你的防火墙策略相关联。 本节课你将学习上图显示的主题。 通过展示识别防火墙策略的不同组成部分的…

Linux之防火墙策略

防火墙 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网&#xff08;US5606668&#xff08;A&#xff09;1993-12-15&#xff09;。防火墙是位于内部网和外部网之间的屏障&#xff0c;…

Linux下管理防火墙策略

目录 1. 防火墙管理工具的切换2. iptables的使用3.关于firewalld的域4.firewalld的基本管理命令5.firewalld的高级规则6.firewall中的NAT规则 防火墙是一组规则。当数据包进出受保护的网络区域时&#xff0c;进出内容&#xff08;特别是关于其来源、目标和使用的协议等信息&…

基础防火墙策略

基于NAT的防火墙策略 原理:通过配置防火墙策略,实现内网可以通过防火墙访问外网,外网不能主动访问内网,保证了局域网的安全性。 上图为本次实验的简略图。 准备工作:外网设为桥接模式,内网设为仅主机模式,防火墙两个模式都有。 步骤: 首先把所有的不必要的防火墙策略…

A模块练习-防火墙策略

说明&#xff1a;iptables 组件是一种工具&#xff0c;也称为用户空间&#xff08;userspace&#xff09;&#xff0c;它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本&#xff0c;否则需要下载该工具并安装使用它。 防火墙策…

Linux进阶(10)--防火墙策略优化

一.火墙介绍 从RHEL7以后&#xff0c;iptables服务的启动脚本已被忽略。请使用firewalld来取代iptables服务。 防火墙是一组规则。当数据包进出受保护的网络区域时&#xff0c;进出内容&#xff08;特别是关于其来源、目标和使用的协议等信息&#xff09;会根据防火墙规则进行检…

H3C 防火墙策略介绍

注意点&#xff1a; H3C防火墙有安全策略和域间策略&#xff0c;安全策略的优先级大于域间策略&#xff0c;会优先匹配安全策略&#xff0c;匹配不到才会匹配域间策略 域间策略&#xff1a;any to any的域间策略优先级低于具体的区域到具体的区域的域间策略 安全策略匹配顺序…

防火墙策略管理-firewalld

1.拓扑图 2.firewalld服务基础 1、Linux防火墙体系 系统服务&#xff1a;firewalld 管理工具&#xff1a;firewalld-cmd、firewalld-config 2、预设安全区域 ①、根据所在的网络场所区分&#xff0c;预设保护规则集 public&#xff1a;仅允许访问本机的sshd等少数几个服务 tru…

firewalld 防火墙策略

一 下面都是在public区 firewalld防火墙默认情况下(也就是public区域)是拒绝所有的&#xff0c;但是public区默认情况下ping和ssh服务都是放开的 [rootnode-1 ~]# firewall-cmd --list-all --zone public public (active)target: defaulticmp-block-inversion: nointerface…

win10 配置防火墙策略

说明 某些情况下&#xff0c;我们想在不关闭防火墙的情况下&#xff0c;开放一些特定的端口&#xff0c;使得特定的应用可以访问本机应用。我们可以配置自定义的防火墙策略来解决这个问题。 配置 控制面板 > 系统和安全 > Windows Defender 防火墙 高级设置 入站规…

防火墙策略管理小工具——网络安全

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、防火墙配置文件1. 地址集合2. 服务集合3. 规则集合 二、防火墙策略管理小工具的开发1. 主要功能2. 框架设计2.1 IP_Set对象2.2 Service对象2.3 Rule对象2.4…

飞塔防火墙策略设置

上周公司要求对一些电脑进行上网限制&#xff0c;只允许部分软件上网。 一、添加地址&#xff1a;在“策略与对象”--“地址”--“新建” 二、输入IP地址&#xff1a;&#xff08;最大陷阱&#xff0c;公司是使用无线上网&#xff0c;对飞塔而言&#xff0c;整个无线网是一个端…