C语言输入输出详解

\qquad C语言本身是不提供输入输出语句的,输入和输出都是由C标准函数库中的函数来实现的,本文主要介绍scanf(),printf(),getchar(),putchar(),gets(),puts()这些都是在include

\qquad scanf和printf

1.printf

\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 2321,是因为将 − 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
2.scanf

\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

你可能感兴趣的:(c语言)