文档章节

C语言常用的输入输出函数

jockchou
 jockchou
发布于 2015/06/10 19:19
字数 1327
阅读 25
收藏 0
点赞 0
评论 0

C语言常用的输入输出函数


函数原型如下:

#include <stdio.h>

int puts(const char *s);
char *gets(char *s);

int fputs(const char *s, FILE *stream);
char *fgets(char *s, int size, FILE *stream);

int putc(int c, FILE *stream);
int getc(FILE *stream);

int fputc(int c, FILE *stream);
int fgetc(FILE *stream);

int putchar(int c);
int getchar(void);

函数功能描述

puts() 输出一个字符串到标准输出流stdout,并在字符串结尾处自动添加换行符。

gets() 从标准输入设备读取一行字符保存到s指向的缓冲地址中,直到终端输入一个换行符或者读到EOF,并将换行符替换成一个空字符('\0')。它不会检查目标缓冲区是否能够容纳输入,所以很不安全。不要使用这个函数,应该使用fgets代替它。

fputs() fputs()函数是puts的面向文件的版本,第二个参数用来说明输出的文件,可以使用stdout作为来调用,stdout在stdio.h中定义。与puts()不同,fputs()并不为输出自动添加换行符,也不会输出结尾的空字符。

fgets() gets()函数有一个bug,它不检查预留存储区是否足够容纳输入的内容,fgets()改进了这个问题,它第二个参数让你指定最大读入字符数。同时fgets()会把读到的换行符存到字符串里。第三个参数用来指定读取哪一个文件,从键盘读数据时,可以使用stdin,这个标识符在stdio.h中定义。

fputc() 输出一个字符C到指定文件中,会将C转换成无符号字符类型。

fgetc() 从指定文件中读取下一个字符,返回字符的整数表示,或者是EOF,或者是错误。

putc() putc()同等于fputc()函数,如果被实现成宏的形式,它的流不能是有副作用的表达式。

getc() putc()同等于fputc()函数,如果被实现成宏的形式,它的流不能是有副作用的表达式。

putchar() 等同于putc(c, stdout)。

getchar() 等同于getc(stdin)。

从以上说明我们可以看出,我们不需要记住那么多的函数,只需要使用fgetc(),fputc()他fgets()和fputs()这2组基本可以满足开发需求。其他的要不就是这2组的宏封装,要不就是有Bug,可被替代。同时记住fgets()函数第二个参数用来指定读取的最大长度,输出超过这个长度或者遇到换行或者文件尾,就会返回。fgets()会保留读取的换行,fputs()不会自动添加换行。这样正好匹成一对。把文件指定为stdin或者stdout即可达到输出到标准io设备的效果。

int fputs(const char *s, FILE *stream);
char *fgets(char *s, int size, FILE *stream);

int fputc(int c, FILE *stream);
int fgetc(FILE *stream);

注意: 有副作用的表达式,指的是表达式执行后,会改变表达式中某些变量的值,例如(++, --)操作。这样的表达式不应该在宏里出现,否则在宏展开时候会出现意想之外的结果。例如计算平方的宏:

#include<stdio.h>

#define MACRO_SQRT(x) (x)*(x)       
int func_sqrt(int x)       
{
	return x * x;       
}

int main(void)
{
	int x, y, n = 5, m = 5;
	x = MACRO_SQRT(++n);
	y = func_sqrt(++m);
	
	printf("MACRO_SQRT = %d\n", x); //49
	printf("func_sqrt  = %d\n", y); //36
	
	return 0;
}

宏与函数的区别在于,函数的参数是如果是表达式,会先计算出表达式的结果,再传递给函数使用。而宏是先展开,再计算表达式的值。宏展开后是这个样子的:

(++n)* (++n)

2次++后,n的值为7,结果便是7*7=49。为了避免这种问题,在给宏传递参数时,不要使用有副作用的表达式,即表达式中变量值会变化的表达式。

代码举例

#include<stdio.h>

int main(void)
{	
	/*假设想输入1234567890这10个字符,
	* 多出的2个空间用来保存输入的换行符和自动添加的空字符(\0)
	*/
	char input_str[12];
	
	fputs("input your name, please!\n", stdout);
	
	fgets(input_str, sizeof(input_str) / sizeof(char), stdin);
	
	fputs(input_str, stdout);
	
	return 0;
}

测试输出:

$ ./fputs 
input your name, please!
1234567890
1234567890

$ ./fputs 
input your name, please!
1234567890aaaa
1234567890a$ 

当多输出aaaa这几个字符时,输出最后的一个换行符被第一个a占据了,也就是说input_str数组中保存了'1234567890a\0'这12个字符。也就是说char *fgets(char *s, int size, FILE *stream)函数第二个参数如果指定为12,系统最多读取11个字符,并自动添加一个'\0'。

上面的程序有一个缺点,即fgets()函数会自动保存输入的换行,但是如果空间不够,换行就不会有,字符串里换行符(\n)的不确定性会给显示带来不方便,正如上例中那样。一个好的解决办法是,检测fgets()输入的字符串,去掉最后的换行符,在输出需要时,再考虑添加换行符。

#include<stdio.h>
#include<string.h>

int main(void)
{	
	
	char *pos;
	
	char input_str[11];
	
	fputs("input your name, please!\n", stdout);
	
	fgets(input_str, sizeof(input_str) / sizeof(char), stdin);
	
	if (pos = strchr(input_str, '\n')) {
		*pos = '\0';
	}
	
	printf("%s\n", input_str);
	
	return 0;
}

上例展示了使用strchr()函数来定位输入的字符串最后是否有换行符,如果有,则把它去掉。

© 著作权归作者所有

共有 人打赏支持
jockchou
粉丝 29
博文 38
码字总数 28900
作品 1
深圳
高级程序员
字符串处理函数

C语言中字符串处理函数介绍 下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数)。所有的C语言编译系统中一般都提供这些函数。 1、puts函数——输出字符串的函数 一...

东腾科技
2016/08/29
19
1
五、printf和scanf函数

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略 一、printf函数 这...

长平狐
2013/03/28
145
0
JAVA-1026. 程序运行时间(15)

要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”...

za303122
2017/05/18
0
0
C语言基础学习基本数据类型-变量的输出与输入

变量的输出 变量如何输入输出呢?实际上,在这之前你已经使用过输出语句(printf语句)了,我们可以使用printf来执行输出。 printf语句的使用方法如下: 格式控制字符串用特定的格式说明符代...

MayaTeacher
2016/08/19
13
1
PAT乙1026. 程序运行时间(15)

题目在这里 1026. 程序运行时间(15) 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时...

saber_sld
04/19
0
0
算法学习之路|程序运行时间

要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”...

kissjz
02/25
0
0
PAT乙级1026. 程序运行时间(15)

题目 链接https://www.patest.cn/contests/pat-b-practise/1026 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被...

qq_30138291
2017/12/13
0
0
C语言学习必须清楚的事情,这就是C语言的开始

基本常识 计算机语言:把人与计算机之间交流的语言叫做计算机语言 计算机语言分为高级语言和低级语言 高级语言:远离硬件 低级语言:贴近硬件 指令:是指计算机执行某种操作的命令。它由一串...

小辰GG
2017/11/30
0
0
【3.1】【C】【PAT】B1026

要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开 始运行到clock()被调用时所耗费的时间。这个时间单位是clocktick,即“时钟打点”...

elas_crimson
03/27
0
0
PAT 1026. 程序运行时间(15)

要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”...

xnh_565175944
2017/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

gRPC学习笔记

gRPC编程流程 1. proto文件定义 proto文件用于定义需要通过gRPC生成的接口,可以理解为接口定义文档 2. 通过构建工具生成服务基类代码-Maven或Gradle 3. 服务端开发 服务端实现类须实现通过构...

OSC_fly
5分钟前
0
0
Docker Mac (三) Dockerfile 及命令

Dockerfile 最近学习docker的时候,遇到一件怪事,关于docker镜像可能会被破坏,还不知道它会有此措施 所以需要了解构建Dockerfile的正确方法 Dockerfile是由一系列命令和参数构成的脚本,这些命...

___大侠
32分钟前
0
0
NetCat Tutorials

Hacking with Netcat part 1: The Basics Hacking with Netcat part 2: Bind and reverse shells Hacking with Netcat part 3: Advanced Techniques 10 Introduction to Netcat - pdf NetCat......

zungyiu
32分钟前
0
0
Android Studio+NDK+Cmake 移植FFmpeg-4.0.2命令行工具

一、编译 参考大神的帖子,亲测一次编译成功:https://blog.csdn.net/bobcat_kay/article/details/80889398 鉴于以前查文档的经验,这里附上编写例子的时间:2018年7月22日 我用的是ubantu,...

她叫我小渝
32分钟前
0
0
mysql创建数据库

登录MYSQL mysql -u root -p 脚本创建数据库WeChat,并制定默认的字符集是utf8mb4。 CREATE DATABASE Wechat DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; 授权 grant all......

niithub
47分钟前
0
0
svn: Unable to connect to a repository URL 的解决方案

错误图示: 解决办法:清除本地保存的授权信息; 1:右键点击本地文件夹,选择设置; TortoiseSVN -> Settings 2:在弹出的对话框中选择 Saved Data, 右侧选择:授权地方清理所有。 然后点确...

宁哥实战课堂
今天
1
0
sleep与wait的区别

Thread.sleep(XXX)方法消耗CPU吗? 这个知识点是我之前认识一直有错误的一个知识点,在我以前的认识里面,我一直认为Thread.sleep(1000)的这一秒钟的时间内,线程的休眠是一直占用着CPU的时间...

码代码的小司机
今天
1
0
20位活跃在Github上的国内技术大牛 leij 何小鹏 亚信

本文列举了20位在Github上非常活跃的国内大牛,看看其中是不是很多熟悉的面孔? 1. lifesinger(玉伯) Github主页: https://github.com/lifesinger 微博:@ 玉伯也叫射雕 玉伯(王保平),...

海博1600
今天
1
0
Mybatis收集配置

一、Mybatis取Clob数据 1、Mapper.xml配置 <resultMap type="com.test.User" id="user"> <result column="id" property="id"/> <result column="json_data" property="jsonData" ......

星痕2018
今天
1
0
centos7设置以多用户模式启动

1、旧版本linux系统修改inittab文件,在新版本执行vi /etc/inittab 会有以下提示 # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON......

haha360
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部