3. 数据的输入与输出
C 语言把输入输出放在库函数里。键盘输入通常走 stdin,屏幕输出走 stdout;stderr 专门留给错误信息。
3.1 printf
常用格式说明如下:
| 类型 | 常用格式 | 说明 |
|---|---|---|
int |
%d、%i |
有符号十进制 |
unsigned int |
%u、%o、%x、%X |
无符号十、八、十六进制 |
long / long long |
%ld / %lld |
长整型、超长整型 |
double |
%f、%e、%g |
printf 中 float 会提升为 double |
char |
%c |
单个字符 |
| 字符串 | %s |
输出到 \0 为止 |
| 指针 | %p |
参数应转换为 void * |
再记一下场宽和精度:%8.2f 表示总宽度至少为 8,小数点后留 2 位;%-8d 左对齐;%08d 用 0 补齐。实际内容超过场宽时照常输出,不会为了凑宽度把数字截掉。
格式符和变量类型一定要对上。printf("%d %d", i++, i++) 这种写法也别用:两个实参谁先算没有固定顺序,没法可靠判断输出。
3.2 scanf
- 普通变量要传地址,所以通常要写
&;字符数组名本身就能表示首地址,不再加&; float *用%f,double *用%lf,不要与printf的规则混淆;%s应限制最大宽度,给结尾的\0留出一个位置;%c不跳过空白,常写成" %c",前面的空格会吃掉残留空白;%*d表示读入一个整数但不保存;- 返回值是成功赋值的项目数,输入结束且没有完成任何转换时返回
EOF。
格式串里的普通字符也要匹配。比如 scanf("%d,%d", &a, &b) 规定了两个数中间必须输入逗号,这一点很容易看漏。
3.3 字符与字符串输入输出
getchar() 每次读一个字符,但返回类型是 int,因为除了正常字符还要表示 EOF。所以要判断文件结束时,接收变量也用 int:
puts 输出字符串并自动换行。读取一整行应使用 fgets:
课件特别提醒不要把 scanf 和 gets 混着用,前一个函数留在输入缓冲区里的换行会被后一个函数直接读走。gets 本身也没有长度限制,现在已经不再使用;课内只读一个不含空格的字符串时,用带宽度的 %s 即可。
课件还讲了 _getch、_getche 和 _ungetch。它们来自 <conio.h>,在 Visual C 一类环境里能用,但不是标准库函数。标准 C 中把字符退回输入流用的是 ungetc。