\qquad C语言本身是不提供输入输出语句的,输入和输出都是由C标准函数库中的函数来实现的,本文主要介绍scanf(),printf(),getchar(),putchar(),gets(),puts()
这些都是在include
中
\qquad printf()函数的一般形式:printf(“格式控制”,输出列表);
printf()可以只有输出格式,而没有输出列表,输出格式中,%用于输出指定格式,\为转义字符,用于输出部分特殊字符
printf("Hello World!\n");
输出结果
Hello World!
\n为换行,下面介绍常见的转义字符及其效果
转义字符 | 效果 |
---|---|
\’ | 输出一个’ |
\" | 输出一个" |
\\ | 输出一个\ |
\b | 将光标后退一个位置 |
\t | 将光标跳转到下一个TAB的位置 |
\n | 换行 |
\r | 将光标跳转至本行行首 |
\o(o代表一个8进制数) | 与该八进制对应的字符 |
\xh(h代表一个16进制数) | 与该十六进制对应的字符 |
栗子
∙ \bullet ∙\t
printf("a\tb");
输出:
a b
∙ \bullet ∙\r
printf("\tb\ra");
输出:
a b
注意\t会擦掉中间输出的字符,比如
printf("abc\r\td\n");
printf("\td\rabc");
输出:
d
abc d
而\b会擦掉最后一个输出的字符
printf("ab\b");
输出:
a
∙ \bullet ∙\o
printf("\101");
输出:
A
∙ \bullet ∙\xh
printf("\x41");
输出:
A
\qquad %是指定输入格式,输入的格式为%后面的格式字符,下面给出输入数据的格式字符
格式字符 | 字符效果(大写即输出英文为大写) |
---|---|
d | 有符号的的十进制 |
u | 无符号的十进制 |
o | 无符号的八进制 |
x,X | 无符号的十六进制 |
f | 浮点数,小数形式输出 |
e,E | 浮点数,指数形式输出 |
g,G | 浮点数,取e,f较短的输出,自动舍去末尾0 |
c | 单个字符 |
s | 输入字符串 |
ld,lo,lx,lu,lf,le | 对应的长整型或者double |
1.%d与%u
int a = -1;
printf("%d %u",a,a);
输出:
-1 4294967295
可以看到,对于 − 1 -1 −1%d
输出为 − 1 -1 −1,而%u
输出为 4294967295 4294967295 4294967295,即 2 32 − 1 2^{32}-1 232−1,是因为将 − 1 -1 −1的补码当作无符号数字进行输出而导致的结果
2.%f,%e,%g
float f = 123.456;
printf("%f\n%e\n%g",f,f,f);
输出:
123.456001
1.234560e+002
123.456
说明一下小数格式的控制,在%和f/e/g中间加上 m . n m.n m.n来控制小数格式,其中 m m m控制小数的总位数,如果 m < m< m<小数总位数责没有效果,大于则在开头补 0 0 0(右对齐), m m m可以省略,在 m m m前加 − - −则可以左对齐即将多出的空格补在末尾, n n n是控制小数的小数位数
float f = 123.456;
printf("%f\n%.2f\n%10f\n%10.2f\-10.2f",f,f,f,f,f);
输出:
123.456001
123.46
123.456001
123.46
123.46
3.%c
输出单个字符,对应输出列表可以为ASC码
char a = 'A';
printf("%c\n",65);
printf("%c\n",'\101');
printf("%c",a);
输出:
A
A
A
4.%s
输出一个字符串
char s[6] = "abcde";
printf("%s\n",s);
printf("%s","abcde");
输出:
abcde
abcde
对于字符串的输出, m . n m.n m.n一样可以控制输出格式,保留输出前 n n n位,总共占 m m m位(必须要输出总位数小于等于 m m m才有用)
char s[6] = "abcde";
printf("%3s\n",s);
printf("%.3s\n",s);
printf("%5.3s\n",s);
printf("%-5.3s",s);
输出:
abcde
abc
abc
abc
\qquad scanf()函数的一般形式:scanf(“格式控制”,地址表列);
\qquad 格式控制与printf基本一致,不一样的是scanf地址表列不能为空,对于每一个格式控制的输入都要有相应的变量对应,而且每一个输入变量前必须有一个&(取地址符)
错误栗子
int a,b,c;
scanf("%d%d%d",a,b,c);
正确的
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
默认的,scanf中各个变量间用空格、TAB或者换行分开,但是也可以指定输入间隔符,比如
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
输入时应输入
1,2,3
int a,b,c;
scanf("%d:%d:%d",&a,&b,&c);
1:2:3
但是单个字符的输入是没有分隔的
char a,b,c;
scnaf("%c%c%c",&a,&b,&c);
输入:abc
则a = a,b = b,c = c;
输入:a b c
则a = a,b = (空格),c = b;
对于字符串的输入,会在空格时停止或分开
char s[255];
scanf("%s",&s);
printf("%s",s);
输入:abc def
输出:abc
char s1[255],s2[255];
scanf("%s%s",&s1,&s2);
printf("%s\n%s",s1,s2);
输入:abc def
输出
abc
def
scanf也可以用 m m m来控制输入,指定输入数据所占的列数
int a,b;
scanf("%3d%3d",a,b);
printf("%d %d",a,b);
输入:123456
输出:123 456
如果对%c控制输入列数,只会将第一个赋值给变量,后面的会被空出而不会给下一个变量
char s1;
scanf("%3c",&s1);
printf("%c",s1);
输入:abc
输出:a
3.getchar()
\qquad getchar()
该函数没有参数,返回值为输入的第一个字符的ASC码,如果出错,返回 − 1 -1 −1
char c = getchar();
printf("%c",c);
输入:a
输出:a
注意:换行也会读入到getchar()
中,一般来说getchar()
只用于字符和字符串的读入,但是通过位运算和getchar()
结合可以比scanf快,即快读
下面给出快读模板
inline int read(){
int n = 0,l = 1;
char c = getchar();
while(c < '0' || c > '9'){
if(c == '-') l = -1;
c = getchar();
}
while(c >= '0' && c <= '9'){
n = (n << 1) + (n << 3) + (c & 15);
c = getchar();
}
return n * l;
}
4.putchar()
putchar(x)
:参数x为要输出的字符
输出成功返回该值的ACS码,失败返回EOF
char c = 'A';
putchar(c);
putchar('\n');
putchar('A');
结果为
A
A
一般也是用于输出字符和字符串,也可以用于快速输出,下面给出模板
inline void write(int x){
char F[200];
if(!x) putchar('0');
if(x < 0){
putchar('-');
x = -x;
}
int cnt = 0;
while(x > 0){
F[cnt ++] = x % 10 + '0';
x /= 10;
}
while(cnt) putchar(F[-- cnt]);
}
5.gets()
gets()
函数是从输入流中输入一个字符串存储到字符数组中,并将该字符数组的起始地址作为返回值
gets()
函数从流中读入字符串,直到出现换行符或读到文件为为止,最后加上 N U L L NULL NULL(‘\0’)作为结尾,不会存储末尾的换行符
char s[20];
gets(s);
printf("%s",s);
输入:abc def
输出:abc def
6.puts()
puts()
将一个字符串(以’\0’结束的字符串)输出
可以包含转义字符
char s[] = "abc\ndef";
puts(s);
输出:
abc
def