目录
1.printf函数
(1)printf函数的语法
(2)printf函数的宽域
(3)printf函数的返回值
2.scanf函数
(1)scanf函数的语法
(2)scanf函数的返回值
3.getchar函数
(1)getchar函数的语法
4.putchar函数
(1)putchar函数的语法
5.gets函数和puts函数
(1)gets的语法
(2)puts的语法
在C语言中常见的输入输出函数有六个,分别是scanf'函数,printf函数,getchar函数,gets函数,putchar函数,puts函数,本篇文章就带你一次搞定这些函数的用法。
printf函数是一个输出函数,能将数据打印到终端中,使用前需引用头文件stdio.h
printf(格式控制,输出列表);
①格式控制:是由双引号括起来的一个字符串,它里面包含两个信息,分别为格式声明和普通字符。格式声明是由%和格式字符组成,比如%d,%f,%p等。他的作用是将格式列表中的数据按照指定的方式输出。普通字符在输出后原样输出。看一下实例测试,快速了解该函数用法。
#include
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
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
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
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
int main()
{
char str[20] = { 0 };
//键盘输入 abc ef
scanf("%s", str);
printf("%s\n", str);
return 0;
}
scanf函数只能读取空格之前的数据,本例中并未读取,可以体现scanf函数不能读取空格的特性。
代码二:
#include
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
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
int main()
{
int str[20] = { 0 };
gets(str);
puts(str);
//测试puts是否添加换行符
printf("1");
return 0;
}
结语:以上就是本人在学习期间对这六个函数的理解,如有错误,欢迎广大读者纠正。