0.getchar()、putchar()

输入缓冲区,键盘输入是“行缓冲”遇到一个换行符的时候清空缓冲区。

标准流,stdin和stdout,是标准的输入输出流,键盘输入就是用的stdin。

文件结尾,C不关心操作系统是如何检测文件结尾,C在检测到文件结尾之后返回EOF。

getchar();——从输入缓冲区读取一个字符,不管字符是什么,都读取。

putchar()——打印一个字符,没有换行符。注意putchar只打印一个字符,换行符也算一个字符,想要打印换行符应该是putchat('\n')。

跳过剩余的char:

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

1.scanf()

返回值——返回正确读取的个数int型。

这里注意:如果scanf中%d是连着写的如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”(如果是“.”呢么要在输入数据的时候加“.”)如“2,3,4”。

函数测试:用户混合输入int数据和字符串数据。注意这里两个输入是用的英文句号"."分开的,所以输入的时候两个数据应该用英文句号隔开否则就不算正确输入。

函数设计思路:用户输入两种类型的数据:int和字符串,当用户输入的类型错误的时候提示用户错误并请求再次输入。

#include<stdio.h>

int main(void)
{
int age;
char name[];
puts("please enter your age and your name"); while(scanf("%d.%s",&age,name) != )
{
while(getchar()!='\n')//清空输入缓冲区
{
continue;
}
puts("age and name,please anain!"); } while(getchar()!='\n')//清空输入缓冲区
{
continue;
} printf("hi %s,",name);
printf("you are %d years old\n",age);
getchar();//等待
return ;
}

程序中有两个专门清空缓冲区的while循环,(1)用户输入错误的时候输入缓冲区域会留下错误输入的数据,这些数据会连同下一次输入一起作为输入数据,因此必须要清除掉。(2)如果用户输入正确,由于scanf()函数读取之后会留下换行符'\n'在输入缓冲区中,同样影响下一次输入,因此也要清除掉,其实这里最好用一个getchar(),用getchar()效率更高,我这是偷懒复制的。

2.printf()

#include<stdio.h>
int main(void)
{
int i, j;
i=;
j=;
printf("i=%d;j=%d", i, j);
return ;
}

注意printf()不输出换行符,想要换行需要这样:

printf("i=%d;j=%d\n", i, j);

3.gets()

读取输入缓冲区中所有的字符,遇到换行符\n的时候停止,并且把\n丢弃然后在读入数据的尾部加上\0。

gets()读取成功之后返回字符串的指针,如果读取失败则返回NULL。

用gets的好处是不用和用scanf一样在后边跟着一个清理\n的getchar()。如下:

#include<stdio.h>

int main(void)
{
char name[];
puts("please enter your name");
while(gets(name)==NULL)
{
puts("name,please anain!");
}
printf("hi %s",name);
getchar();//等待
return ;
}

但是gets()函数步检查容量是否超过参数的容量,特别容易发生溢出,上面的例子name[]容量只有20,一旦用户输入超过20个字符的容量,name数组后面的内存数据就会被覆盖,因此这是非常不安全的。

C11标准中已经删除了gets()函数,用gets_s()函数代替。

4.gets_s()

大写的尴尬。

5.fgets()

fgets()函数有三个参数,第一个是读取的字符串要写入的变量,第二个是读取多少个字符(n-1个,例如第二个参数写3那么函数读取2个字符,字符数据大于2就会报错),第三个参数是数据源,如果是从键盘读取那么就是stdin(标准输入流)。

fgets()函数不会把\n丢掉并在字符串尾部添加\0,而是原封不动的把所有东西全部写入到变量中(\n也是)。

与gets()一样fgets()也是返回输入字符串指针(成功读取的话),读取失败会返回NULL。

把gets()函数改成如下;

#include<stdio.h>

int main(void)
{
char name[];
puts("please enter your name");
while(fgets(name,,stdin)==NULL)
{
puts("name,please anain!");
}
printf("hi %s,how old are you?",name);
getchar();//等待
return ;
}

就会有如下输出:

很尴尬,因为fgets()函数连同\n一起读取到了数组name中,输出的时候也一起输出了,所以“,how old are you ?”就被换行了。

6.puts()

puts()函数使用很简单,他只有一个参数,字符串地址。

与printf()不同,puts()函数自动添加一个\n到字符串尾部,也就是说:自动换行。

还是看上面的代码:

#include<stdio.h>

int main(void)
{
char name[];
puts("please enter your name");
while(fgets(name,,stdin)==NULL)
{
puts("name,please anain!");
}
printf("hi %s,how old are you?",name);
getchar();//等待
return ;
}

注意main()函数内的第二行,尾部并没有换行符\n。但是输出的时候:

自动换行了。

注意puts()的参数是一个地址,如果想要输出name中的字符串的话:

 puts(name);

注意:puts()遇到空字符\0就会停止输出。

如下:

d没有了。大写的尴尬!!!

但这还不是最严重的,puts()只有遇到空字符\0才会结束输出,那么,如果字符串中没有空字符呢?

这时puts就不知道应该在哪里停止输出了,所以会造成程序的不稳定,如下我重新修改了下数组数据,删掉了\0:

程序在e后面多了一个方框。

注意如果字符串中没有\0,printf也会蒙圈的:

7.fputs()

fputs()需要指定输出流:

且fputs()并不会像puts()一样自动添加换行符。

注意:如果name数组最后一个元素不是\0的话还是会出错的。

8.总结

gets()与put()搭配,输入的时候把\n替换成\0(其实是去掉之后再加上,意思差不多),输出的时候添加\n

fgets()与fput()搭配,输入的时候原封不动的把\n读取,输出的时候不自动添加\n。

参考:https://www.cnblogs.com/qingergege/p/5925811.html

C语言——输入输出函数的更多相关文章

  1. c语言输入输出函数

    上学年学习c语言的时候比较匆忙,没好好吸收. 现在有时间好好复习下. 本文就c语言常见输入函数进行简单介绍,对比. ps:由于自己能力有限,时间有限,多数介绍,总结都是摘录网上相关学习资料,下面给出本 ...

  2. C语言输入输出函数总结

    常见函数: FILE *p char ch char buf[max] fopen("filename","ab")//打开名为filename的文件并返回一个 ...

  3. 【421】C语言输入输出函数说明

    目录: sscanf & sprintf scanf & printf getchar & putchar fgets & fputs fscanf & fpr ...

  4. c语言的输入输出函数

    参考文章: http://blog.sina.com.cn/s/blog_784f40b80100psg9.html C语言输入输出函数分为两类: 1.格式化输入输出函数 2.非格式化输入输出 --- ...

  5. C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()

    本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...

  6. C语言学习<输入输出函数,函数的调用>

    #include <stdio.h> /* 输入输出函数的学习 函数的调用 2017.05.25 soulsjie */ //输入连个数字求最大值 void main(){ int Max ...

  7. C语言中输入输出函数

    1.1.1 格式化输入输出函数Turbo C2.0 标准库提供了两个控制台格式化输入. 输出函数printf() 和scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据.pri ...

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

    算法提高 3-2字符串输入输出函数   时间限制:1.0s   内存限制:512.0MB      描述 编写函数GetReal和GetString,在main函数中分别调用这两个函数.在读入一个实数 ...

  9. C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化

      一.字符串输入输出函数 1.  cin.get()   逐个字符输入输出 2.  cin 可以将整个字符串一次性输入,但是,cin将空格.Tab和回车键,因此不能用于数组的一次性输入. 注意:ci ...

随机推荐

  1. Day4_名称空间与作用域

    函数嵌套: 函数的嵌套调用:在调用一个函数的过程中,又调用了了另外一个函数 比如说比较多个值的大小,可以利用这种方法: def max2(x,y): if x > y: return x els ...

  2. C++判断字符串是否为空的一个小问题

    刚才visual studio下处理一个函数字符串入参,判断入参字符串是否为空有点小问题. 接口函数声明是这样的:SHORT GETWFSINFPINKEYDETAIL(LPCTSTR strKeyN ...

  3. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  4. php判断图片是否存在的几种方法

    在我们日常的开发中,经常需要用到判断图片是否存在,存在则显示,不存在则显示默认图片,那么我们用到的判断有哪些呢?今天我们就来看下几个常用的方法: 1.getimagesize()函数 getimage ...

  5. Java枚举enum以及应用:枚举实现单例模式

    枚举作为一个常规的语言概念,一直到Java5才诞生不得不说有点奇怪,以至于到现在为止很多程序员仍然更喜欢用static final的形式去命名常量而不使用,一般情况下,Java程序员用这种方式去实现枚 ...

  6. 【转】javascript 作用域链

    JavaScript函数的作用域链分为定义时作用域链和运行时作用域链: 函数被定义的时候,它有一个属性[[scope]]标明它的定义作用域链,定义时作用域链[[scope]]遵守这样的规则:一个函数的 ...

  7. Linux 下 Redis 安装与配置

    1.Redis 的安装 在 Ubuntu 系统安装 redis 可以使用以下命令: $ sudo apt-get update $ sudo apt-get install redis-server ...

  8. python3 爬取qq音乐作者所有单曲 并且下载歌曲

    1 import requests import re import json import os # 便于存放作者的姓名 zuozhe = [] headers = {'User-Agent': ' ...

  9. js基础进阶--图片上传时实现本地预览功能的原理

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 最近在项目上加一个图片裁剪上传的功能,用的是cropper插件,注意到选择本地图片后就会有预览效果,这里整理一下这种预览效 ...

  10. Spring对象生存周期(Scope)的分析

    一.Scope定义 Scope用来声明容器中管理的对象所应该处的限定场景或者说对象的存活时间,即容器在对象进入相应的Scope之前,生产并装配这些对象,在该对象不再处于这些Scope之后,容器通常会销 ...