C语言输入输出方法的区别和总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36754767/article/details/89707302

C语言有很多的输入输出方法,它们在C语言标准库stdio.h中总结下常用方法的区别

常用方法如下:

输入方法 输出方法
int scanf(const char *format, ...)从标准输入 stdin 读取格式化输入。 int printf(const char *format, ...) 发送格式化输出到标准输出 stdout
int getchar(void) 从标准输入 stdin 获取一个字符(一个无符号字符) int putchar(int char)把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中。
char *fgets(char *str, int n, FILE *stream)从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。 int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符
char *gets(char *str)从标准输入 stdin 读取一行,并把它存储在 str 所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定 int puts(const char *str) 把一个字符串写入到标准输出stdout直到空字符,但不包括空字符。换行符会被追加到输出中
int fgetc(FILE *stream)从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。 int fputc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。
int getc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。 int putc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。

C语言中流的概念
流看作是一种数据的载体,通过它可以实现数据交换和传输。包含输入/输出流,C语言中有标准输入(stdin)/标准输出流(stdout)和其他形式的输出/输出流(stream),视情况而定。

gets/putsscanf/printf的区别

//*****************************************************************************

两者区别在代码注释中给出

#include<stdio.h>

int main(){

	char s1[20],s2[20];
	printf("please input your s1 value;\n");
	scanf("%s",s1);//读取键盘标准输入(stdin),不包括制表符TAB、空格、回车
	//getchar();//如果不加则s2则输出为回车,必须用getchar()吃掉回车 区别:gets方法会获得回车,scanf方法不会,如果接下来使用scanf作为标准输入,则不会存在字符问题
	printf("please input your s2 value:\n");
	gets(s2);//从缓冲区读取字符,以回车为结束符
	   

	printf("your input s1 is %s\n",s1);
	//printf("your input s2 is %s\n",s2);
	puts(s2);//puts方法会自动添加换行符到输出中
	return 0;

}

出现警告

warning:hello.c:(.text+0x4a): warning: the `gets’ function is dangerous and should not be used.

原因:gets方法不会去检查字符串的长度,如果字符串过长就会溢出.如果溢出数据覆盖其他数据就会导致不可预知
的错误.

Linux 查看man手册也会提示错误如下:

Never use gets(). Because it is impossible to tell without knowing
the data in advance how many characters gets() will read, and
because gets() will continue to store characters past the end of the
buffer, it is extremely dangerous to use. It has been used to break
computer security. Use fgets() instead.

提示推荐使用使用fgets()方法使用

//*****************************************************************************

fgets/fputsgets/puts的区别

定义:

  • fgets:从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。
  • fputs:把字符串写入到指定的流 stream 中,但不包括空字符。
  • gets:从标准输入 stdin 读取一行,并把它存储在 str 所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
  • puts:把一个字符串写入到标准输出stdout,直到空字符,但不包括空字符。换行符会被追加到输出中。

从指定的流中输入/输出,那就是也可以从标准输入/输出流获取字符串,如上面一个例子所示,当使用gets进行字符串输入时,因没对字符串的长度进行检查,故会造成不可预知的问题,而fgets用于标准输入/输出流时的效果就体现出来了,fgets可以指定读取字符串的长度n

#include<stdio.h>


int main(){
	
	char s1[20],s2[20];
	printf("please input s1 value is:\n");
	gets(s1);
	printf("please input s2 value is:\n");
	fgets(s2,5,stdin);//从标准输入流stdin中读取字符串长度为5-1的字符串到s2中

	printf("s1 value is:\n");
	puts(s1);
	printf("s2 value is:\n");
	fputs(s2,stdout);//从标准输出流stdout中输入s2

	return 0;

}

打印结果:
在这里插入图片描述
从打印结果我们还可以看到putsfputs的一个区别:

  • puts会自动添加换行符到字符串末尾,而fputs不会,其他大概没啥区别

//*****************************************************************************

其他

剩下的其他几种输入输出大概也是字符串和单个字符的区别,没什么好写的

猜你喜欢

转载自blog.csdn.net/qq_36754767/article/details/89707302