目录

一.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语言(字符串输入)相关推荐

  1. C语言字符串输入输出函数

    C语言字符串输入输出函数 putchar()函数 getchar()函数 puts()函数 gets()函数 getche()函数 getch()函数 putchar()函数 格式: putchar( ...

  2. C语言字符串输入与输出函数

    字符串输入 如果想把一个字符串读取到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串,C库提供了三个读取字符串的函数:scanf().gets()和fgets(). 创建存储空间 ...

  3. c语言字符串输入梳理总结

    C语言字符串输入输出梳理 前言 1.什么是字符串 2.输入函数 1.scanf 2.gets 3.fgets 总结 前言 在学习c语言过程中,总是遇到字符串输入出错问题,今天学习完梳理一下.c语言输入 ...

  4. c语言字符串输出函数是,C语言字符串输入与输出函数

    字符串输入 如果想把一个字符串读取到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串,C库提供了三个读取字符串的函数:scanf().gets()和fgets(). 创建存储空间 ...

  5. C语言字符串输入及输出的常用格式

    ---------------- 版权声明:本文为CSDN博主「爆爆爆炸beng」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://bl ...

  6. c语言字符串输入的陷阱

    首先先看一道题目:KiKi开始学习英文字母,BoBo老师告诉他,有五个字母A(a), E(e), I(i), O(o),U(u)称为元音,其他所有字母称为辅音,请帮他编写程序判断输入的字母是元音(Vo ...

  7. c语言字符串输入输出函数总结

    1.字符串输入函数 gets()--读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在这些字符的末尾添加一个空字符使其成为一个 C 字符串.但是它无法检查数组是否装得下输入行,如果输入的 ...

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

    1.字符串数组+初始化 char s1[]="array"; //字符数组 char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾 ...

  9. c 语言字符串输入空格,C++中带空格字符串的输入问题解决

    前言 字符串一直是一个重点加难点,很多笔试面试都会涉及,带空格的字符串更是十分常见,现在对字符串的输入问题进行一下总结. C++用cin输入的时候会忽略空格以后的字符,比如 char a[100]; ...

  10. C语言字符串常用函数总结(持续更新)

    最近在重温C语言的一些基础知识,感觉C语言字符串操作还是比较难的,在学习的过程中总结了一些常用的字符串相关函数,包括C语言字符串输入.字符串输入.计算字符串长度.字符串赋值.字符串分割.字符串拼接.字 ...

最新文章

  1. 样式表(CSS:Cascading Style Sheets)简要教程[上]
  2. 什么是Vue?Vue的工作原理是什么?
  3. java的容器类有哪些实现方式_Java基础--容器类
  4. aspx repeater 用法_ASP.NET-----Repeater数据控件的用法总结
  5. [Linux]Linux系统调用列表
  6. CodeForces Round #290 Div.2
  7. mac开机启动项怎么设置,苹果电脑开机启动项在哪里设置
  8. iOS功能测试工具 Frank
  9. pentaho java代码_将Pentaho移植到Eclipse_ee里运行
  10. 数学分析对计算机有帮助吗,计算机辅助数学分析教学的好处
  11. MySQL 5.7 中文全文检索
  12. CondaSSLError: OpenSSL appears to be unavailable on this machine.
  13. python怎么换行输入print_python中print换行的方法
  14. 写作活动第三期!让我们再挣200元稿费吧!
  15. 大厂Offer拿到手软啊!技术详细介绍
  16. wps页眉添加下划线
  17. 排球分组循环交叉编排_第一届“黄河金三角杯”全国学生排球邀请赛竞赛规程...
  18. windows 7 SP1补丁包 (64位) V 2013.10 官方版
  19. ImportError: cannot import name ‘xxx‘ from ‘xxx‘
  20. Java密码连接redis

热门文章

  1. Flask全套知识点从入门到精通,学完可直接做项目
  2. excel导入基于Easypoi一对多导入(实现合并单元格)
  3. VMware虚拟机去虚拟化完整版教程|永久过强壳VMP、SE壳、GK盾、TMD教程|VMware去虚拟化吾爱汇编论坛教程完整版
  4. 杂牌机搞机之旅(一)——获得root权限(刷入magisk)
  5. CDN--降低75%CDN成本!黑科技PCDN前世今生:定义、功能、架构、场景和优势
  6. 一篇文章解读提速、降费黑科技:PCDN定义、功能、架构、场景和优势
  7. 深度学习之(DNN)深度神经网络
  8. 真香!安利 6 个 Python 数据分析神器
  9. 算法导论中英文版下载
  10. 12[红+绿+蓝+Alpha]