C-格式化输出和输入

格式化输出和输入

占位符

  • 占位符就是先占住一个固定的位置, 等着你再往里面添加内容的符号
  • 格式占位符 (%) 是在C/C++语言中格式输入函数, 如 scanf()、printf() 等函数中使用, 其意义就是起到格式占位的意思, 表示在该位置有输入或者输出
格式控制符 说明
%c 一个字符
%s 一个字符串
%d %hd %ld 十进制, 有符号的int/short/long 整型
%u %hu %lu 十进制, 无符号的int/short/long 整型
%o %ho %lo 八进制, 无前缀, 无符号的整型
%#o %#ho %#lo 八进制, 有前缀, 无符号的整型
%x %hx %lx
%X %hX %lX
十六进制, 无前缀, 无符号的整型
x/X 对应十六进制大小写
%#x %#hx %#lx
%#X %#hX %#lX
十六进制, 有前缀, 无符号的整型
x/X 对应十六进制大小写
%f %lf 十进制的float/double 浮点型
%e %le
%E %lE
指数形式的浮点型
e/E 对应指数大小写
%g %lg
%G %lG
十进制和指数中较短的形式输出浮点型, 并且小数部分的最后不会添加多余的0
e/E 对应指数大小写

格式化输出

int printf(const char* format, ...);

  • fromat 为格式化字符串, 包含两部分. 第一部分是正常字符, 原样输出. 第二部分是格式占位符.
  • ... 为可变参数列表, 可变参数个数与格式占位符数量一致.
  • 返回字符的个数. (包括空白字符)
#include <stdio.h>

int main()
{
    int a = 100;
    int b = 200;
    int c = a + b;
    printf("a = %d, b = %d, "
           "a + b = %d", a, b, c);
}

格式化输入

int scanf(const char* format, ...);

  • 按指定格式从键盘上把数据输入到指定变量中
  • 参数与printf()一致
  • 成功则返回读入的数据项数
  • 遇到错误或遇到end of line, 返回EOF
int n;
scanf("%d", &n);

当用户从终端输入信息, 数据存放到输入缓冲区, scanf()函数通过地址找到变量存储区域, 然后缓冲区里的信息传送给变量这块地址

  1. 如果读取数字或字符串
    空白字符(空格符、制表符和换行符)都视为一次输入的终止标记
    在读取时会自动忽略空白字符, 即首先删除这些字符
    需要严格按照规定的格式输入
int n, m;
scanf("%d+%d", &n, &m);  // 1+2
printf("%d %d", n, m);  // 1 2
  1. 如果读取字符
    两个变量之间的空白字符也会被读入
    不会忽略空白字符:
char n, m;
scanf("%c%c", &n, &m);  // a b
printf("n = %c, m = %c", n, m);  // n = a, m =  (此为空格)
  1. 以回车结束一次输入时, 回车符会残留在缓冲区中

缓冲区的影响

当我们先后读取两个字符时, 代码如下:

#include <stdio.h>

int main()
{
    char n, m;
    scanf("%c", &n);
    scanf("%c", &m);
    printf("n = %c\nm = %c", n, m);
    return 0;
}

我们先输入一个"a", 然后回车, 发现程序结束了, 显示输出"n = a\nm = ", 此处m实际上为回车符.

这就是缓存区中残留的回车符的影响.

解决方法有三:

  • 方法一
char n, m;
scanf("%c\n", &n);
scanf("%c", &m);
printf("n = %c\nm = %c", n, m);
return 0;
  • 方法二
char n, m;
scanf("%c", &n);
fflush(stdin);
scanf("%c", &m);
printf("n = %c\nm = %c", n, m);
return 0;
  • 方法三
char n, m;
scanf("%c", &n);
int ch;
while ((ch = getchar()) != EOF && ch != '\n')
{
    ;
}
scanf("%c", &m);
printf("n = %c\nm = %c", n, m);
return 0;
posted @ 2023-03-21 20:57  Khrushchefox  阅读(10)  评论(0编辑  收藏  举报