基本输入与输出

1 printf(), scanf()

基本函数说明

printf()
参数列表:变量、常量和表达式
返回值:打印字符的个数(输出错误时则返回负值)
scanf("格式字符串",参数列表)
格式字符串:允许存在普通字符,要求按照该格式进行输入;
参数列表:指针(对于基本变量类型,前面加&;字符数组则直接写)
返回值:返回成功读取的项数(如果没有读取任何项则返回0),
读取方式:由于scanf本身特性,输入时恒会(哪怕格式字符串要求)跳过输入时的所有空白

转换说明修饰符

%5.2f 字符宽度为5字符(打印的内容在字段右侧),小数点后有两位数字
字段宽度:至少的字段宽度,如果待打印对象的数字数超过此,则自动扩大字段宽度以符合证书长度,否则将以空格代替。可助于制表。
%-5d :打印的数字位于字段的左侧。

修饰符”*”

特别的,对于printf,可以通过修饰符代替具体的转换说明修饰符。例如:
`printf(“%
.d”,intA,intB,intPut);<br />对于scanf`,修饰符可以试scanf跳过相应的输入项。例如:
scanf("%*d%d",&n);
将跳过第一个整数,将第二个整数赋值给n。

参数传递原理

printf("%ld %ld %ld",n1,n2,n3);
根据变量类型将这些值放入栈中,然后控制转到printf()。函数根据转换说明从栈中读取值,%ld代表printf()应该读取四个字节,则printf读取前4个字节作为第一个值。

2 程序对内容的读取

2.1 输入缓冲 Input Buffer

input[char] -> 缓冲区 -> output[char]
为什么作为标准:一些计算机不允许无缓冲输入,所以ANSI不提供调用无缓冲输入的标准方式
两种缓冲:

  1. 完全缓冲I/O(缓冲区被填满时刷新缓冲区)
  2. 行缓冲I/O(按下Enter后刷新缓冲区)

    2.2 文件 File, 流 Stream, 键盘输入 Keyboard input

    file: 存储器储存信息的区域

    C 处理文件的方式:

    low-level I/O:调用操作系统的函数
    standard I/O package:创建用于处理文件的标准模型和一套标准I/O函数;不用考虑系统差异,处理方式统一;处理对象是stream而非file

    文件结尾: EOF (end of file)

    UNIX: Ctrl+D
    DOS: Ctrl+Z
    cstdio: # define EOF(-1)
    1. while((ch=getchar())!=EOF)

2.3 程序打开文件的两种方式

1. 显式使用特定的函数打开文件、关闭文件、读取文件、写入文件

2. 重定向:命令行操作

设计与键盘和屏幕交互的程序,通过重定向,输入到文件或从文件输出
终端中的重定向运算符:连接可执行程序和数据文件

  1. ./Program.exe < input.txt
  2. ./Program.exe > output.txt
  3. ./Program.exe > output.txt < input.txt

不能重定向输入自多个文件,不能重定向输出至多个文件

2.4 缓冲输入的换行符‘\n’问题

scanf可以跳过换行符,但getchar不会。缓冲输入以\n结尾时,传送了换行符。

  1. while(getchar()!='y'){
  2. [code]
  3. while(getchar()!='\n')
  4. continue;
  5. }

单字符 I/O: getchar(), putchar()

ch=getchar();效果等同于scanf("%c",&ch);
putchar(ch);效果等同于printf("%c",ch);
注意:它们是预处理宏而非真正的函数。

  1. while((ch=getchar())!='\n')