赞
踩
目录
在C语言中常见的输入输出函数有六个,分别是scanf'函数,printf函数,getchar函数,gets函数,putchar函数,puts函数,本篇文章就带你一次搞定这些函数的用法。
printf函数是一个输出函数,能将数据打印到终端中,使用前需引用头文件stdio.h
printf(格式控制,输出列表);
①格式控制:是由双引号括起来的一个字符串,它里面包含两个信息,分别为格式声明和普通字符。格式声明是由%和格式字符组成,比如%d,%f,%p等。他的作用是将格式列表中的数据按照指定的方式输出。普通字符在输出后原样输出。看一下实例测试,快速了解该函数用法。
- #include <stdio.h>
- int main()
- {
- int num = 95;
- printf("这是数字%d\n", num);
- printf("这是字符%c\n", num);
- printf("这是地址%p\n", num);
- return 0;
- }
以下为该函数的输出结果

明明同一个数据为什么打印出不同的结果呢?那是因为三个语句都用了不同的格式声明,%d是打印一个十进制的数字,%c是打印一个字符,而图中下划线的ASCII值正是95,%p是以地址的形式打印,编译器输出的是一个16进制的数字,0000005F转换为十进制的值也正是95。以下为一些常见的格式声明。
| 格式声明 | 说明 |
| %d | 以带符号的十进制形式输出整数 |
| %o | 以八进制无符号形式输出整形 |
| %x,%X | 以十六进制无符号形式输出整形 |
| %u | 以无符号十进制形式输出整形 |
| %c | 以字符形式输出一个字符 |
| %s | 输出字符串 |
| %f | 以单精度浮点型形式输出小数 |
| %lf | 以双精度浮点型形式输出小数 |
| %p | 以地址的形式输出 |
在格式声明中,我们还可以控制输出的格式,我们通过在%和字母之间加入一个数字,规定输出数字所占的宽度,比如printf("这是数字%5d\n", num);,中间的5规定了num这个数字占5个位置,如果不够则原样输出,如果溢出则在左边补空格直至充满5个位置为止,如果是负数则在右边补空格。

注:标点符号也算一个位置。
先说结论,printf函数的返回值是,该函数打印字符的个数,接下来通过一道经典的题目带你仔细品味该函数返回值的用法。
- #include <stdio.h>
- int main()
- {
- int num = 43;
- printf("%d", printf("%d", printf("%d", num)));
- return 0;
- }
以上代码的结果为4321,那么为什么是这个结果呢?
分析:通过观察可以发现第五行代码由三个printf函数组成,要想知道第一个printf函数的打印结果需要知道嵌套的第二个printf函数的返回值,要知道第二个printf函数的返回值得知道嵌套的第三个printf函数的返回值,第三个printf函数执行打印数字43,由于打印了两个字符因此返回2,因此第二个嵌套函数打印了2,并返回了打印字符的个数,即1,因此最外层的printf函数打印1,最终结果因此为4321。
scanf函数是一个输入函数,能从键盘中读取数据,使用前需引用头文件stdio.h
scanf(格式控制,地址列表);
格式控制就不再多做介绍,与printf函数中的格式控制大体相同,通过阅读以下代码,了解scanf函数的用法。
- #include <stdio.h>
- int main()
- {
- char ch = 'a';
- int num = 0;
- double f = 0;
- scanf("%c %d %lf", &ch, &num, &f);
- printf("%c\n", ch);
- printf("%d\n", num);
- printf("%f\n", f);
- return 0;
- }

有以下几点需要特别注意:
①&为取地址符,地址列表中只能放地址的参数,如果是数组可放数组名,因为数组名代表首元素地址。
②在格式控制中,尽量不要添加普通字符,因为添加普通字符时,在你从键盘中输入数据时,也要将这些普通字符添加上。
③scanf函数不会读取空格和回车,所以在写入以上数据时,每写一个数据就空一格或换行。
scanf函数的返回值是该函数读取数据的个数,牛客网有许多多组输入的试题都可以通过该函数的返回值来实现。
例:判断一个数是否为奇数,如果是则输出该数字,要求多组输入,并输出。
- #include <stdio.h>
- int main()
- {
- //创建num变量,输入的数字都存入num变量中
- int num = 0;
- while (scanf("%d", &num) == 1)
- {
- if (num % 2 == 1)
- {
- printf("%d ", num);
- }
- }
- return 0;
- }
以上 while (scanf("%d", &num) == 1) 此行代码等价于while (scanf("%d", &num) != EOF)和
while (~scanf("%d", &num))。
EOF即是end of file的缩写,意思是文件的结尾,当scanf读取不到数据或者读入错误时,会返回EOF,EOF的本质或者说他的值是-1,下图是VS源码对EOF的定义。

getchar函数是一个读取字符的函数,使用前需使用头文件stdio.h
char ch = getchar( );
该函数并无参数,返回值是从键盘上读取的字符,如果读取错误或者无法读取数据则返回EOF。
注:该函数与scanf函数类似,但在使用中依然有一些细节需要注意
1.该函数只能用来读取字符,不能用来读取其他数据
2.该函数可以读取空格和回车,而scanf不能读取空格和回车
可以通过以下两段代码细细品味其中的细节
代码一:
- #include <stdio.h>
- int main()
- {
- char str[20] = { 0 };
- //键盘输入 abc ef
- scanf("%s", str);
- printf("%s\n", str);
- return 0;
- }

scanf函数只能读取空格之前的数据,本例中并未读取,可以体现scanf函数不能读取空格的特性。
代码二:
- #include <stdio.h>
- int main()
- {
- char psw[20] = { 0 };
- printf("请输入您的密码:");
- scanf("%s", psw);
- printf("请确认(Y/N):");
- getchar();
- if ('Y' == getchar())
- {
- printf("确认成功");
- }
- return 0;
- }
本段代码中,第八行为上面会用一个getchar函数呢?这就涉及到了内存的读写数据,以下简单的介绍缓冲区及其作用。

如上图,键盘输入数据时,并不是直接存入内存中的,而是先将数据存入缓冲区,然后一个一个的读取数据。在以上代码中,假设我输入的是abcdefg这个字符串作为密码,abcdefg确实被存进了psw这个数组中,由于scanf函数不会读取换行符号,因此缓冲区存在一个\n,如果没有第八行的getchar函数,if语句中的getchar函数会读取到\n,if语句里的条件表达式就永远不会为真,该程序就出现了bug。故第八行的getchar函数的目的是为了清空缓存区。
putchar函数是一个输出函数,将字符打印到屏幕上,使用前需引用stdio.h文件
putchar(字符常量或变量);
该函数不仅仅能将字符常量或变量作为参数,还可以将int型的变量或常量作为参数,当将int型作为参数时,作用是打印该整型对应的ASCII值。
- #include <stdio.h>
- int main()
- {
- char ch = 'A';
- //将字符变量作为参数
- putchar(ch);
- //将字符常量作为参数
- putchar('a');
- int i = 98;
- //将整型常量作为参数
- putchar(66);
- //将整型变量作为参数
- putchar(i);
- return 0;
- }
gets函数是一个输入函数,其功能是将键盘获取输入的字符串,puts函数则是一个输出函数,其功能是将字符串打印到屏幕上,使用它们前都需要引用头文件stdio.h
gets(字符数组名);
该函数有以下需要注意点:
1.gets函数可以读取空格。
2.gets函数在读取结束后,默认加一个回车。
puts(字符数组名);
该函数与gets函数特点类似,可以输出空格,在输出结束后也会默认添加回车。
通过以下代码体会这两个函数的特点:
- #include <stdio.h>
- int main()
- {
- int str[20] = { 0 };
- gets(str);
- puts(str);
- //测试puts是否添加换行符
- printf("1");
- return 0;
- }

结语:以上就是本人在学习期间对这六个函数的理解,如有错误,欢迎广大读者纠正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。