1. 标准输入/输出
Ø 最简单的输入机制是使用getchar()从标准输入中(键盘)一次读取一个字符:
int getchar(void)
getchar函数在每次被调用时返回下一个输入字符。若遇到文件尾,则返回EOF
Ø 在许多环境中,可使用符号<来实现输入重定向,它将把键盘输入替换为文件输入:
如果程序prog中使用了函数getchar,则命令行
prog < infile
将使得程序prog从输入文件infile(而不是键盘)中读取字符
Ø 函数 int putchar(int c)用于输出数据
putchar(c)将字符c送至标准输出上,在默认情况下,标准输出为屏幕显示
函数putchar将返回输出的字符,如果发生错误,则返回EOF
Ø 通常情况下,可以使用”>输出文件名”的格式将输出重定向到某个文件中
如果程序prog中使用了函数putchar,则命令行
prog >输出文件名
将把程序prog的输出从标准输出设备重定向到文件中
Ø 如果系统支持管道,那么命令行:
prog | anotherprog
将把程序prog的输出从标准输出通过管道重定向到anotherprog的标准输入中
2. 格式化输出——printf函数
int printf(char *format, arg1, arg2, …)
函数printf在输出格式format的控制下,将其参数进行转换与格式化,并在标准输 出设备上打印出来,它的返回值为打印的字符数
Ø 格式字符串包含两种类型的对象:
1. 普通字符
在输出时,普通字符将原样不动地复制到输出流中
2. 转换说明
转换说明并不直接输出到输出流中,而是用于控制printf中参数的转换和打印。
每个转换说明都由一个百分号字符(%)开始,并以一个转换字符结束
在字符%和转换字符中间可能依次包含下列组成部分:
Ø 负号: 用于指定被转换的参数按照左对齐的形式输出
Ø 数: 用于指定最小字段宽度。转换后的参数将打印不小于最小字段宽度的 字段。如果有必要,字段左边(如果使用左对齐方式,则为右边)多 余的字符位置用空格填充以保证最小字段宽
Ø 小数点:用于将字段宽度和精度分开
Ø 数: 用于指定精度,即指定字符串中要打印的最大字符数、浮点数小数点 后的位数、整型最少输出的数字数目
Ø 字母h,l:字母h表示将整数作为short类型打印
字母l表示将整数作为long类型打印
Ø printf函数的运算顺序:从右向左计算
int a = 1;
printf (“%d, %d, %d\n”, a++, a++, a);
=> 2, 1, 3
volatile int a = 1; //申明a是易变的,防止编译器优化
printf (“%d, %d, %d\n”, a++, a++, a);
=>2, 1, 1
Ø 向一个指定的流输出
int fprintf (FILE *stream, const char *format, arg1, arg2, …)
返回值是实际写入的字符数,若出错则返回一个负值
printf (…)函数 等价于 fprintf (stdout, …)
Ø 向一个指定的缓冲区输出
int sprintf (char *s, char *format, arg1, arg2, …)
函数的输出被写入到字符串s中,并以’\0’结束。s必须足够大,以足够容纳下输 出的结果。该函数返回实际输出的字符数,不包括’\0’
3. 格式化输入——scanf函数
int scanf (const char *format, …)
scanf函数从标准输入中读取字符序列,按照format中的格式说明对字符序列进行解释,并把结果保存到其余的参数中
Ø 当scanf函数扫描完其格式串,或者碰到某些输入无法与格式控制说明匹配的情况时,该函数将终止,同时,成功匹配并赋值的输入项的个数将作为函数值返回,所以,该函数的返回值可以用来确定已匹配的输入项的的个数。如果到达文件的结尾,该函数将返回EOF
Ø 返回EOF与0是不同的,0表示下一个输入字符与格式串中的第一个格式说明不匹配。
Ø 下一次调用scanf将从上一次转换的最后一个字符的下一个字符开始继续搜索
Ø int fscanf (FILE *stream, const char *format, …)
fscanf函数根据格式串format从流stream中读取输入,并把转换后的值赋给后续各个参数,其中的每个参数都必须是一个指针。当格式串format用完时,函数返回。如果到达文件的末尾或在转换输入前出错,该函数返回EOF;否则,返回实际被转换并赋值的输入项的数目
scanf(…)函数与fscanf(stdin, …)相同
Ø int sscanf(char *string, char *format, arg1, arg2, …)
用于从一个字符串(而不是标准输入)中读取字符序列
它按照格式参数format中规定的格式扫描字符串string,并把结果分别保存到arg1, arg2, …这些参数中。这些参数必须是指针。
scanf, fscanf, sscanf函数的所有参数都必须是指针
scanf(“%d”, n); 错误
scanf(“%d”, &n); 正确
编译器在编译时一般检测不到这类错误