跳转至

3. 数据的输入与输出

C 语言把输入输出放在库函数里。键盘输入通常走 stdin,屏幕输出走 stdoutstderr 专门留给错误信息。

3.1 printf

printf("格式控制字符串", 输出项1, 输出项2, ...);

常用格式说明如下:

类型 常用格式 说明
int %d%i 有符号十进制
unsigned int %u%o%x%X 无符号十、八、十六进制
long / long long %ld / %lld 长整型、超长整型
double %f%e%g printffloat 会提升为 double
char %c 单个字符
字符串 %s 输出到 \0 为止
指针 %p 参数应转换为 void *

再记一下场宽和精度:%8.2f 表示总宽度至少为 8,小数点后留 2 位;%-8d 左对齐;%08d 用 0 补齐。实际内容超过场宽时照常输出,不会为了凑宽度把数字截掉。

格式符和变量类型一定要对上。printf("%d %d", i++, i++) 这种写法也别用:两个实参谁先算没有固定顺序,没法可靠判断输出。

3.2 scanf

int a;
double x;
char word[20];
int ok = scanf("%d%lf%19s", &a, &x, word);
  • 普通变量要传地址,所以通常要写 &;字符数组名本身就能表示首地址,不再加 &
  • float *%fdouble *%lf,不要与 printf 的规则混淆;
  • %s 应限制最大宽度,给结尾的 \0 留出一个位置;
  • %c 不跳过空白,常写成 " %c",前面的空格会吃掉残留空白;
  • %*d 表示读入一个整数但不保存;
  • 返回值是成功赋值的项目数,输入结束且没有完成任何转换时返回 EOF
while (scanf("%d", &a) == 1) {
    /* 每次只处理一次有效输入 */
}

格式串里的普通字符也要匹配。比如 scanf("%d,%d", &a, &b) 规定了两个数中间必须输入逗号,这一点很容易看漏。

3.3 字符与字符串输入输出

getchar() 每次读一个字符,但返回类型是 int,因为除了正常字符还要表示 EOF。所以要判断文件结束时,接收变量也用 int

int ch;
while ((ch = getchar()) != EOF) {
    putchar(ch);
}

puts 输出字符串并自动换行。读取一整行应使用 fgets

char line[100];
if (fgets(line, sizeof line, stdin) != NULL) {
    /* 成功读入,换行符可能仍在 line 中 */
}

课件特别提醒不要把 scanfgets 混着用,前一个函数留在输入缓冲区里的换行会被后一个函数直接读走。gets 本身也没有长度限制,现在已经不再使用;课内只读一个不含空格的字符串时,用带宽度的 %s 即可。

课件还讲了 _getch_getche_ungetch。它们来自 <conio.h>,在 Visual C 一类环境里能用,但不是标准库函数。标准 C 中把字符退回输入流用的是 ungetc

评论