linux程序io.h,基本IO函数操作 - Linux C编程实战之路_Linux编程_Linux公社-Linux系统门户网站...

news/2024/5/9 14:58:18/文章来源:https://blog.csdn.net/weixin_31119221/article/details/116752079

在学习C语言的时候,基本的输入输出是非常重要的,因为我们时常要接收用户的输入,而且时常要将结果输出到屏幕,因此非常有必要注重地学习一下。

最常用的两个基本IO函数莫过于 printf()  和 scanf() 了,下面首先来详细地介绍一下它们。来看第一个示例代码:

//example1.c

#include

int main(void)

{

char a1 = 'A';

int a2 = 100;

float a3 = 3.14;

printf("a1=%c, a2=%d, a3=%f\n", a1, a2, a3);

short int a4 = 10;

long int a5 = 20;

long long int a6 = 30;

printf("a4=%hd, a5=%ld, a6=%lld\n", a4, a5, a6);

}

在上面的代码中,第8行和第13行就是将各种不同的数据类型打印出来,这里,%c %d %f %hd %ld %lld 这些称之为 格式控制符,其实,printf 和 scanf 函数之所以称为格式化IO函数,就是因为它们可以根据不同的格式控制符来处理各种类型的数据。

简单地讲,%d 用来表示 十进制 有符号 整型。%c 表示 字符。%f 表示浮点型数据。具体的所有的格式控制符的详细解释,请看下面的代码:

//example2.c

#include

int main(void)

{

char a1 = 'A';

printf("%c", a1); // c就是character字符的意思

short a2 = 10;

printf("%hd", a2); // h就是half一半的意思,表示a2是“半个”整型

int a3 = 100;

printf("%d", a3); // d就是decimal十进制的意思

long a4 = 100;

printf("%ld", a4); // l就是long的意思,表示a4是一个长整型

long long a5 = 100;

printf("%lld", a5); // ll就是long long的意思,表示a4是一个长长整型

float f1 = 1.0;

printf("%f", f1); // f就是float的意思,表示f1是一个单精度浮点型

double f2 = 1.0;

printf("%lf", f2);

long double f3 = 1.0;

printf("%Lf", f3); // 注意下,长双精度不是 %llf ,而是 %Lf

return 0;

}

下面来看看 scanf() ,这个函数是用来接收用户输入的,比 printf() 要考虑的更多一点,但是他们的格式控制符是一致的,也就是说,对于example2.c 里面看到的所有在 printf() 函数中使用的 格式控制符,在 scanf() 函数中完全适用,具体而言,scanf() 函数的用法如下:

/example3.c

#include

int main(void)

{

char a1;

scanf("%c", &a1); // 将用户输入的一个字符,放置在a1里

scanf("%hhd", &a1); // 将用户输入的一个数值,放置在a1里

short a2;

scanf("%hd", &a2); // 将用户输入的一个短整型,放置在a2里

int a3;

scanf("%d", &a3); // 将用户输入的一个整型,放置在a3里

long a4;

scanf("%ld", &a4); // 将用户输入的一个长整型,放置在a4里

long long a5;

scanf("%lld", &a5);  // 将用户输入的一个长整型,放置在a5里

float f1;

scanf("%f", &f1);  // 将用户输入的一个单精度浮点数,放置在f1里

double f2;

scanf("%lf", f2);  // 将用户输入的一个双精度浮点数,放置在f2里

long double f3;

scanf("%Lf", f3);  // 将用户输入的一个长双精度浮点数,放置在f3里

return 0;

}

值得注意的是第 6、7行。我在《LINUX-C成长之路(二)》中讲过,char 型其实就是整型,特点是单字节整型,因此 a1 其实就是用来存储一个整数的,这时,当用户从键盘按下“9” 这个按键的时候,你的程序究竟是要存储一个字符 '9' 呢? 还是要存储一个数字 9 呢? 注意字符 '9' 跟数字 9 是不同的,如果是字符 '9' 的话,我们内存中存储的实际上市它所对应的ASCII码值,也就是57, 如果是数字 9 ,那就是在内存中直接存储 9 。

所以,第6行是将用户的输入当成是字符,此时a1将会存储用户输入的字符的ASCII码值。 第7行是将用户的输入当成数字,而且要将这个数字放置在单字节变量 a1 里面,因此第 7 行的格式控制符是 %hhd  ,前面的 hh 表示 half  half ,也就是一半的一半的整型,也就是单字节整型。

下面,研究一下一个很重要的问题:对于 scanf() 而言,假如你要用户输入一个整数,或者输入一个浮点数,但是用户很调皮,偏不输入一个规规矩矩的你想要的数据,你的程序会如何呢? 是立即就罢工甚至爆炸呢? 还是有足够的智能来处理这些小顽皮的捣蛋呢?请看下面的例子:

//example4.c

#include

int main(void)

{

printf("请输入一个0-127之间的整数\n");

char c;

scanf("%hhd", &c);

printf("这个数对应的字符是: %c\n", c);

return 0;

}

在example4.c 中,如果用户规规矩矩地输入你所要求的 0-127之间的 ASCII码值,程序当然可以顺利运行,打印出其对应的字符,但问题是假如用户输入诸如:

abcd 或者 80.5 或者 80abcd 或者 abcd80  , 但example4.c 遇到这样的输入的时候,它是无能为力的。因为它没有任何的输入确认的判断。

首先我们要知道一个事情,就是scanf() 这个函数的返回值,事实上,scanf() 这个函数的返回值代表了其正确地得到了用户输入的数据的个数,举个例子就明白了,就如有这个一段代码:

int a, b, c;

int n;

n = scanf("%d%d%d", &a, &b, &c);

那么用户的输入分别是:

1,依次输入 100  200  300

2,依次输入 100  abc  300

3,依次输入 abc  200  300

n 的结果,则分别是 3, 1, 0.  当用户是第一种情况的时候,100,200和300都正确地被赋值到了a,b和c3个变量中。因此scanf正确得到了 3 个值,所以返回3. 第二种情况,scanf 只能正确地得到 100 这个数据并将其赋值给 a,但是后面的 abc 不是一个整数,因此被 scanf 拒绝,且 scanf 此时立即返回 1,代表正确得到了1 个值。在第三种情况下,用户一来就输入了 abc,scanf() 函数发现状况不妙,后面的 200,300 都不被理睬,返回了一个 0 ,代表啥也没得到,啥也没赋值。

关键是:那些没有被正确匹配并且赋值的输入,到哪儿去了? 比如第二种情况下的 abc 和 300, 第三种情况下的 200 和300,它们会自动消失吗? 答案是否定的。事实上,这些用户输入的数据并非直接了当地传递给了程序中的变量,而是先由标准IO库函数“暂管”起来,将它们放在一个缓冲区中,然后,scanf() 函数从这个缓冲区中逐个地拿取数据,当数据的类型匹配时,就继续拿取,当数据的类型不匹配时,则立即停止拿取数据,并返回已经拿取的数据个数。

因此上面的第一种情况是:将100,200和300都拿取过来,分别赋值给a,b和c,然后返回一个3,代表 scanf() 从缓冲区中正确拿取了3个数据。

第二种情况是:将 100 拿取过来,赋值给a,然后碰到 abc 不符合要求,因此立即停止拿取数据,并返回 1, 代表拿了一个数据。注意,此时 abc 和 300 并未消失,而是残留在缓冲区中。

第三种情况是:一开始就遇到 abc,不符合格式要求,因此 sacnf() 立即返回一个 0 ,代表啥也没拿到。同理,此时用户输入的 abc,200 和 300 并未消失,也残留在缓冲区中。

知道了这个道理,我们在要求用户再次输入数据的时候,就要注意了,因为上次格式不匹配的数据会残留在缓冲区中,请看下面的错误的代码:

//example5.c

int main(void)

{

printf("请输入一个整数\n");

int n, ret;

while(1)

{

ret = scanf("%d", &n);

if(ret != 1)

printf("格式不对,请再输一遍!\n");

else

break;

}

printf("你输入的数是: %d \n", n);

}

这个代码,原意是想让用户输入一个整数,然后将其输出,如果输入的不是整数,就要求用户再输入一遍。可惜这是一段错误的代码,因为假如用户输入了一个 字母 a,这个 字母将会残留在缓冲区中,影响用户的下一次输入,也就是说,不管用户再次输入什么,scanf() 函数永远会先读到那个 a,因此就变成死循环了。正确的代码如下:

//example5.c

int main(void)

{

printf("请输入一个整数\n");

int n, ret;

while(1)

{

ret = scanf("%d", &n);

if(ret != 1)

{

while(getchar() != '\n'); // 用 getchar() 清空非法字符

printf("格式不对,请再输一遍!\n");

}

else

break;

}

printf("你输入的数是: %d \n", n);

}

其中,我们增加了第 15 行,这是一个空循环,循环条件是 getchar() != '\n' ,这句话的意思是,用getchar() 这个函数去缓冲区拿取数据,每次拿去一个字符,只要不是回车符 '\n' ,就继续循环,直到拿到回车符为止。 为什么是回车符呢? 因为用户再输入的时候,最后一定是按了一下回车键来结束输入的(本质原因是标准输入流是行缓冲类型的),因此在缓冲区中的数据一定是以 回车符 '\n' 作为结尾的,当我们用 getchar() 获取到回车符时,就表示缓冲区就被我们清空了!0b1331709591d260c1c78e86d0c51c18.png

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java开源建站工具

http://www.ruanyifeng.com/blog/2011/08/opensource_java_web_development_tools.html 美国程序员Jon Scott Stevens,公布了他的创业公司所使用的开发工具清单。 他的语言平台是Java,开发项目是一个网站(还未上线)。所用到的工具…

将w3cplus网站中的文章页面提取并导出为pdf文档

最近在看一些关于CSS3方面的知识,主要是平时看到网页中有很多用CSS3实现的很炫的效果,所以就打算系统的学习一下。在网上找到很多的文章,但都没有一个好的整理性,比较凌乱。昨天看到w3cplus网站中关于CSS3的一些文章,觉…

aix oracle rac搭建,调整AIX - AIX6.1安装Oracle RAC经历_数据库技术_Linux公社-Linux系统门户网站...

很早之前听说AIX上的可调整的参数很少。且见我做了哪些事?(总体感觉aix在系统管理,配置方面是很方做便的)1、遇到最严重的问题:操作系统关机后,就不能启动到这操作系统了。(天哪,这是什么事道!)原来这次的主机没有配置…

网站不稳定关服务器什么原因,什么原因导致网站排名不稳定呢

如果我们要想处理好导致网站关键词排名不稳定的现象,我们就得先找出导致问题发生的原因。相信多的小伙伴在对网站进行了一段时间的优化之后发现,网站关键词排名总是出现波动不够稳定。我们就得针对这种情况做出一些改进,不然网站排名不停动摇…

网站服务器开创云,开创云服务器

开创云服务器 内容精选换一换如果Linux操作系统弹性云服务器未安装密码重置插件,可以参见本节内容重新设置密码。本节操作重置的是root用户的密码,您可以重置完root密码后登录云服务器后再更换密钥或重置非root用户的密码。Windows操作系统请参见重置Win…

多个html页面复用导航栏,使用webpack从0搭建多入口网站脚手架,可复用导航栏/底部通栏/侧边栏,根据页面文件自动更改配置,支持ES6/Less...

之前只知道webpack很强大,但是一直没有深入学习过,这次从头看了一下教程,然后从0开始搭建了一个多入口网站的开发脚手架,期间遇到过很多问题,所以有心整理一下,希望能给大家一点帮助。多HTML网站使用webpac…

巧用ELK快速实现网站流量监控可视化

前言 本文可能不会详细记录每一步实现的过程,但一定程度上可以引领小伙伴走向更开阔的视野,串联每个环节,呈现予你不一样的效果。 业务规模 8个平台100台服务器10个集群分组微服务600用户N 面临问题 随着分布式微服务容器技术的发展&…

gpu服务器跑网站,gpu服务器跑深度学习

gpu服务器跑深度学习 内容精选换一换GPU加速型云服务器(GPU Accelerated Cloud Server, GACS)能够提供强大的浮点计算能力,从容应对高实时、高并发的海量计算场景。GPU加速型云服务器包括G系列和P系列两类。其中:G系列:图形加速型弹性云服务器…

如何通过优化主页大小,将网站大小减少 62%

什么是图像压缩? 压缩图像是指在保持可接受的视觉质量水平的同时减小图像文件的大小。我使用imagemin来压缩我网站上的图像。 要使用 imagemin,请确保已安装了 Node.js,然后打开终端窗口,cd 到项目的文件夹,并运行以…

5个常用的上传图片进行搜索的网站

1.http://www.tineye.com/ 最常用的图片搜索引擎,一般需要尽可能的接近原图的文件才能锁定图片网址,不过准确度极高。目前缺点是图片收录主要为欧美地区,而且收录量也不是很大。 2.http://www.gazopa.com/ 如图所示相似图片搜索,想…

一个知名网站的微服务架构最佳实现

译者语:如果你的项目正在从单体升级为微服务而忧心;或者你在实践微服务过程中手忙脚乱,本文都是你不容错过的好文。 微服务架构的目标是帮助工程团队更快、更安全、更高质量地交付产品。拆分服务允许团队快速迭代的同时,保证了对系…

创业之前,网站先行

可能你们还没有准备好向世人展示你们的产品,但你们可以先做一些前期工作,先为产品搭建个网站,做好形象工作。我并不是说创业公司都不可以在暗地里开发自己的产品,直到产品成型后才公之于众。但我觉得,如果你已经为你的…

IT创业失败案例解析 - 第四篇 (一家失败的招聘网站)

原文标题:My eHarmony for Hiring Failure(查看原文推荐) 原文作者:eHarmony 双语对照 前几天我通读了我最新博文的评论,它着实吸引了很多评论,像其他一些带有煽动性标题的文章一样,最终&#x…

linux 绑定域名到网站目录,教你绑定域名到你空间的子目录(亲测可用)

近日脑洞大开,Project Ai需要一个论坛,然而为了装逼优雅,我想用个二级域名绑定到我论坛。但万网的虚拟主机默认没绑定域名到子目录这个功能的.中间省略经过一番折腾后,我发现了一个方法(亲测万网可用)其实原理也很简单&#xff0c…

php网站程序哪个好,php的cms系统哪个好

php的cms系统哪个好?国内常见的CMS有dedecms、PHPCMS、WordPress、帝国cms、5UCMS等。相对较好的应该属帝国cms了。帝国cms非常老牌的CMS,就如同该CMS官网介绍的安全、强大、稳定、灵活。安全性:高,姜就是老的辣,老牌的…

【转载】一次面试引发的思考(中小型网站优化思考)

前言 故事的起因是这样的,由于本人地处偏僻工作地点在美丽的冰城哈尔滨虽然地方很美丽,但是这里的软件行业实在是算不上“美丽”,这么多年由于个人原因或者公司原因经常换工作,因为这里都是中小型公司,没有什么大公司。…

tp5网站 服务器部署,tp5云服务器部署

tp5云服务器部署 内容精选换一换SAP B1的部署方案如图1所示。说明如下:VPC网络:为了保证网络的安全,SAP B1系统中所有节点在一个VPC网络内,且所有节点应属于同一个AZ(Available Zone)。公网子网区:NAT(Network Address…

html 隐藏广告代码大全,JS广告代码_JS广告代码大全_js特效代码_js特效代码大全 - 懒人建站...

网站设置点击任何地方弹出新页面广告只弹出,可指定时间间隔。利用Cookie记忆,超过指定时间刷新页面广告会再次生效。参数说明: href:http://www.51xuediannao.com/, //链接地址,必须配置成你的地址 target:_blank, zIndex:9999999…

利用 IIS日志追查网站入侵者

<script type"text/javascript"></script> <script type"text/javascript" src"http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>以前黑站黑了很多&#xff0c;但是就没有想过会不会被追踪到&…

nginx配置多个ssl证书_给自己的网站主页配置ssl证书

使用https 可以防止数据在传输过程中产生一些不必要的泄露&#xff0c;未 的页面在经过ssl证书的签发后会变成https开头&#xff0c;下面记录一下配置https加密的整个过程购买域名首先第一步我们为了防止自己的公网ip暴露出去&#xff0c;需要给自己的网站设定一个全球唯一的域…