前言:
C语言中没有专门的输入输出语句,C语言的输入输出是靠库函数来实现的。
一、格式输入输出函数
1.格式输出函数printf()
格式:
printf(“格式控制字符串”,输出列表);
功能:
按格式控制字符串规定的格式,向输出设备(一般为显示器)输出,输出列表中各输出项的值。
如:
格式控制:由双引号括起来的字符串,用于指定输出格式。
—普通字符:按原样输出的字符。
—格式说明:用来指定输出数据的输出格式。
形式:%[修饰符]格式字符
输出表列:需要输出的数据列表,彼此间用逗号分隔,可以是任意合法的表达式。
补充:
说明:
1)d格式符。
作用:输出一个带符号的十进制整数(正数不输出符号)
格式:
例子:
#include <stdio.h> int main() { int x = 123; printf("|%d|\n", x); printf("|%5d|\n", x); printf("|%-5d|\n", x); printf("|%+5d|%+5d|\n", x,-x); printf("|%-5d|%-5d|\n", x,-x); printf("|%2d|\n", x); return 0; }
测试:
2)o、x和u格式符。
作用:输出一个无符号的八进制、十六进制或十进制无符号整数。
3)c格式符。
作用:用来输出一个字符。
注意:
一个整数,如果在0~~127之间,也可以用字符形式输出,系统会将该整数转换成对应的ASCII码字符。
4)s格式符。
作用:用来输出一个字符串。
格式:
5)f格式符。
作用:以小数形式输出单、双精度实数。
格式:
6)e格式符。
作用:以标准化指数形式输出实数。(小数点前必须有而且只能有一位为非零数字)
格式:
例子:
#include <stdio.h> int main() { char ch = 'a'; float x = 123.456f; double y = 321.564321; float f = 123.456f; printf("%3c\n",ch); printf("%8.2s\n","computer"); printf("%f\n",x); printf("%.0lf\n",y); printf("%10.2e\n", f); return 0; }
测试:
注意:
输出表列可以是变量、常量、数组元素、函数引用、及带运算符的表达式。
例:printf(“%f%d%d%f”,3.14,a+b,x,cos(y));
输出列表中各输出项与各格式说明必须按照从左到右的顺序在类型上一一匹配。
如果实型数据用%d输出,结果出错,整型数据用%f输出,结果为零。
当格式符比输出项多时,多出来的格式符输出不定值;当格式符比输出项少时,多出来的输出项不输出。
输出表列求值顺序:vc是从右到左顺序求值,输出任然是从左到右。
可以在格式符的域宽前面加0,用来补0.
例:printf(“|%-05d|\n”,12); //输出|12 |
printf(“|%05d|\n”,12); //输出|00012|
除了X、E、G格式符外,其他格式符必须用小写字母。
2.格式输入函数scanf()
格式:
scanf(“格式控制”,地址表列);
功能:
按格式控制所规定的格式,从指定的输入设备(一般为键盘)上把数据输入到指定的变量中。
格式控制:
—普通字符:需原样输入的字符。
—格式说明:用于指定输入数据的输入格式。
形式:%[修饰符]格式字符。
地址表列:给出个变量的地址。
—地址是由‘&’运算得到的。
—‘&’是取地址运算符,得到变量在内存中的地址,单目运算符,右结合性。
格式输入的使用与注意:
1)输入数据时采用的分隔符应与格式控制中的分隔符一致。
格式控制中无普通字符时,输入数值型数据可用空格、tab键、回车键作分隔符。
如:
int a,b;float f,e;
scanf(“%d%d”,&a,&b);//输入23空格456回车
2)输入数据时不可指定精度,但可指定宽度。
例:scanf(“%7.2f”,&a);//修饰符错误
3)输入格式符带有* 表示该数据不赋值。
例:scanf(“%d%*d%d”,&a,&c);
输入:12空格34空格567回车;输出a=12,c=567,34被跳过
4)无符号数可用%d、%o、%x格式输入。
5)用c格式符输入字符时,空格、转义字符均为有效字符。(——>回车的意思)
scanf(“%c%c%c”,&a,&b,&c);
若键入:A空格B空格C回车 //则a=A,b=空格,c=B
若键入:A回车B回车 //则a=A,b=回车,c=B
6)%d、%f、%s等在读入数字时,前导的空字符被跳过。
在下列情况下可认为数据输入结束:
遇空格、回车、tab键;
遇宽度结束;
非数值字符。(比如x)
7)double必须用%lf(或%le)
float必须用%f(或%e)
例:
#include <stdio.h> int main() { int a; float b; char c; scanf("%2d%3f%c", &a, &b, &c); printf("a=%d,b=%f,c=%c\n", a, b, c); return 0; }
注意:
格式符%f%c之间不能有空格,要直接输入。
二、字符输入输出函数
1.字符输出函数putchar()
格式:
putchar(c);
功能:
向终端输出一个字符。
说明:
c为参数,可以是字符型变量、整型变量、字符型常量、表达式或者转义字符,但只能是单个字符而不能是字符串。
2.字符输入函数getchar()
格式:
getchar();
功能:
从键盘读入一个字符。
char ch=getchar();
说明:
只能读取一个字符;该字符可赋给字符变量、整型变量或作为表达式的一部分。
三、字符串输入输出函数
1.字符串输出函数puts()
格式:
puts(字符数组名);puts(字符串);
功能:
输出字符数组的值,遇到‘\0’结束输出。
说明:
—puts()一次只能输出一个字符串,输出字符串后自动换行(\n),可以输出转义字符。
2.字符串输入函数gets()
格式:
gets(字符数组名);
功能:将输入的字符串赋给字符数组,输入时,遇到第一个回车键(\n)结束输出,可以结束空格和制表符。
说明:
函数gets()只能一次输入一个字符串。
四、函数的区别
1.gets()函数和scanf()函数的区别
——gets()函数同scanf()函数一样,在读入一个字符串后,系统自动在字符串后加上一个字符串结束标志‘\0’。
——gets()以Enter结束输入,但可以接受空格,会舍弃最后的回车符!并且gets()可以读取多个字符。
不同点:
scanf不能接受空格、制表符Tab、回车;
gets能够接受空格、制表符Tab和回车;
scanf :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中
#include <stdio.h> int main() { char str1[20], str2[20]; gets(str1); scanf("%s", str2); printf("str1:%s\n", str1); printf("str2:%s\n", str2); return 0; }
测试:
2.puts()函数和printf()函数的区别
——puts()函数一次只能输出一个字符串,输出字符串后自动换行(\n)(将‘\0’自动换行为‘\n’),可以输出转义字符。
——printf()函数可以同时输出多个字符串,并且能灵活控制是否换行。
例:
#include <stdio.h> int main() { char str1[] = "student", str2[] = "teacher"; puts(str1);//自动\n puts(str2); printf("%s", str1); printf("%s\n%s", str1,str2); return 0; }
测试:
3.getchar()函数和scanf()函数的区别
——从标准输入(键盘)里读取下一个字符。返回值为用户输入的ASCⅡ码,出错返回-1,用户输入的字符被存放在键盘缓冲区中,直到输入回车键才从缓冲区依次提取字符,当用户键入回车之后,getchar会从输入流中读取第一个字符。
不同点:
scanf遇到 回车(enter),空格,TAB 就会结束一次输入,不会接收空格。
getchar函数只以回车、Enter结束输入,接受空格符。
scanf在一次输入结束后,不会舍弃最后的回车符(即回车符会残留在缓冲区中)
getchar回车作为结束的标志,所以在敲回车时’\n’也被存入缓存
scanf()在读取数字时会跳过空格、回车(Enter)、制表符和换行符!
getchar函数只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符。
代码1:
#include <stdio.h> int main() { char c1=0, c2=0; c1=getchar();//\n留在缓冲区 c2 =getchar();//遇到\n什么都没输出 printf("%c,%c", c1,c2); return 0; }
代码2:
#include <stdio.h> int main() { char c1=0, c2=0; c1=getchar(); getchar(); c2 =getchar(); printf("%c,%c", c1,c2); return 0; }
测试:
提升:
需要用getchar()吃掉回车的几种情况:
前面有scanf 后面也要用scanf()时,中间要用一个空的getchar()吃回车;
前面有scanf,后面要用ch=getchar()接收字符时,中间要用一个空的getchar()吃回车;
2个ch=getchar()中间需要一个空的getchar()吃回车。
4. putchar()函数和printf()函数的区别
——putchar(a)向终端输出一个字符。其中a可以是被单引号引起来的一个字符[putchar(‘e’)],可以是介于0~127之间的一个十进制整型数(包含0和127)[putchar(23)] ,也可以是事先用char定义好的一个字符型变量 并且只能输出单个字符。
——printf()格式化输出函数, 用于向标准输出设备按规定格式输出信息, 并且可以输出各种数据类型,还可以有参数。
不同点:
putchar会有返回值,并且返回值为()内参数值 转换为的unsigned int 值 如果遇到错误或者文件结束,putchar() 返回EOF,而printf()函数返回值为字符串的长度。
测试: