C语言函数库中有一批标准输入输出函数,它是以标准的输入输出设备(一般为终端设备)为输入输出对象的。其中有putchar(输出字符)、getchar(输入字符)、printf(格式输出)、scanf(格式输入)、puts(输出字符串)、gets(输入字符串)。
- C语言本身不提供输入输出语句,输入输出操作是由C语言标准函数库中的函数来实现的。
- printf和scanf不是C语言的关键字,而是库函数的名字。
- 如果程序调用标准输入输出函数,则需在本程序开头用
#include
指令把stdio.h
头文件包含到程序中,例#include <stdio.h>
。
1、scanf()
scanf()函数的一般形式:scanf(“格式控制”,地址表列)
%
是格式字符,指定输入格式- 地址表列中每一项必须以取地址运算符
&
开头
输入数据的类型
格式 | 字符意义 |
---|---|
d | 输入十进制整数 |
o | 输入八进制整数 |
x | 输入十六进制整数 |
u | 输入无符号十进制整数 |
f或e | 输入浮点型数字 |
c | 输入单个字符 |
s | 输入字符串 |
scanf需要注意:
- 在输入多个数值数据时,若格式控制中没有非格式字符作输入数据之间的间隔则可用空格、Tab或者回车做间隔。
- 在输入多个字符数据时,若格式控制中无非格式字符,则认为所有输入的字符均为有效字符。
- 在输入(单个)数据时,C编译器在碰到空格、Tab、回车或者非法数据时(如对“%d”输入45B时,B为非法数据,)则认为该数据结束。输出的结果为45。
事例:
数值数据:
1、在scanf语句的格式串中没有非格式字符时
#include <stdio.h>
int main(void)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。如:
1 2 3
或者
1
2
3
2、在scanf语句的格式串中有非格式字符时
#include <stdio.h>
int main(void)
{
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
输入时用“,”作间隔符,输入为4,5,6
再比如
scanf("a=%d,b=%d,c=%d",&a,&b,&c);
输入应为:a=3,b=4,c=5
3、 用十进制整数指定输入的字符数(宽度):
scanf("%3d",&a);
输入456789只把456赋值变量a,其余部分被截去
scanf("%4d%4d",&a,&b);
输入456789将把456赋值a,而把789赋值b
字符数据
1、在scanf输入的字符数据中无非格式字符时
scanf("%c%c%c",&a,&b,&c);
在输入字符数据时,若格式控制中无非格式字符,则认为所有输入的字符均为有效字符。
输入d\e\f,则把‘d’赋值给a,‘\’赋值给b,‘e’赋值给c。只有当输入为def,才能将‘d’赋值给a.'e’赋值给b,‘f’赋值给c。
2、在scanf输入的字符数据中有非格式字符时
如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
scanf ("%c %c %c",&a,&b,&c);
因为在格式控制中加入了空格作为间隔,所以在输入各数据之间需加空格。
scanf ("%c,%c,%c",&a,&b,&c);
因为在格式控制中加入了‘,’作为间隔,所以在输入各数据之间需加‘,’。
ASCII
#include <stdio.h>
int main(void)
{
char a,b,c;
printf("input character a,b,c\n");
scanf("%c %c %c",&a,&b,&c);
printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);
return 0;
}
输入三个小写字母,输出其ASCII吗和对应的大写字母
将整个字符串一次输入或输出。用‘%s’格式符,意思是对字符串(string)的输入输出
- scanf函数中的输入项如果是字符数组名,不要再加地址符&,因为在C语言中数组名代表该数组第一个元素的地址(或者说数组的起始地址)。
scanf("%s", &str); //str前面不应加&
- 输出的字符中不包括结束符′\0′。
- 用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
#include <stdio.h>
int main()
{
char c[]="China";
printf("%s\n",c);
return 0;
}
- 如果数组长度大于字符串的实际长度,也只输出到遇′\0′结束。
- 如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。
char c[6];
scanf("%s",c);
从键盘输入:China
系统会自动在China后面加一个‘\0’结束符
char str1[5],str2[5],str3[5];
scanf("%s%s%s",str1,str2,str3);
如果利用一个scanf函数输入多个字符串,则应在输入时以空格分隔。
从键盘输入:How are you?
由于有空格字符分隔,作为三个字符串输入。
char str[13];
scanf("%s",str);
从键盘输入:How are you?
由于系统把空格字符作为输入的字符串之间的分隔符,因此只能将空格前的字符“How”送到str中
2、getchar()
getchar()函数原型:int getchar(void)
用于从标准输入输出控制台读取字符
【参数】该函数没有参数
【返回值】函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕。(循环语句中)如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续getchar()调用读取。也就是说,后续的getchat()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。
#include<stdio.h>
int main( ){
int ch;
while( (ch=getchar()) != '\n' ) //从控制台流中读取字符,直到按回车键结束
printf ("%c", ch; //输出读取内容
}
输入abcd,输出abcd
#include<stdio.h>
int main( ){
int ch;
while( (ch=getchar()) != '\n' ) //从控制台流中读取字符,直到按回车键结束
printf ("%d", ch; //输出读取内容
}
输入abcd,输出979899100
注意将ch=getchar()用括号括起来,这里的‘!=’的优先级高于‘=’,否则会导致ch赋值的错误
3、putchar()
putchar()原型:int putchar(int ch)
用于将给定的字符输出控制台
【参数】ch为要输出的字符。
【返回值】输出成功,返回该字符的ASCII码值,否则返回EOF。
purchar(‘字符’)或者putchar(字符变量)
#include <stdio.h>
int main()
{
char ch;
ch='A';
putchar(ch);
putchar('A');
return 0;
}
输出结果:AA
4、gets()
gets()函数原型:char *gets(char *str);
【参数】char *类型, str 可以是一个字符指针变量名(没理解),也可以是一个字符数组名。
1、gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。
2、从终端输入一个字符串到字符数组,并且得到一个函数值,该函数是字符数组的起始地址
gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL(‘\0’)作为字符串结束。(使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。) 所读取的字符串暂存在给定的参数string中。
#include <stdio.h>
int main()
{
char str1[20]={0}; //字符数组初始化为\0
gets(str1);
printf("%s",str1);
puts(str1);
return 0;
}
从键盘输入:Computer
输出:ComputerComputer
将输入的字符串″Computer″送给字符数组str(请注意,送给数组的共有9个字符,而不是8个字符),返回的函数值是字符数组str的第一个元素的地址。
5、puts()
puts()函数原型:int puts(int *s);
作用:将一个字符串(以‘\0’结束的字符序列)输出到终端
用puts函数输出的字符串中可以包含转义字符。
在用puts输出时将字符串结束标志′\0′转换成′\n′,即输出完字符串后换行。
#include <stdio.h>
int main(void)
{
char str[]={"China\nBeijing"};
puts(str);
return 0;
}
输出结果:China
Beijing