Skip to content

1 C++风格的输入输出

C++中的基本输入输出语句是cincout。它们的用法如下:

  1. 输入:cin >> 表达式1 >> 表达式2 >> 表达式3 ... >> 表达式n;
  2. 输出: cout << 表达式1 << 表达式2 << 表达式3 ... << 表达式n;

使用时请包含头文件iostream

示例:

cpp
#include<iostream>
using namespace std;

int main(){
    int x;
    float y, z;
    cout << "Please input" << " an int number:" << endl;
    cin >> x;
    cout << "The int number is x = " << x << endl;
    cout<< "Please input two float number:" << endl;
    cin >> y >> z;
    cout << "The first float number is y = " << y <<endl;
    cout << "The second float number is z = " << z <<endl;

    return 0;
}

提醒:

需要注意的是 C++风格的输入输出比较慢,在处理大量数据的输入输出时我们往往会选择 C 风格的输入输出(就算你写了优化代码)。

2 C 风格的输入输出

C 风格的基本输入输出是printfscanf,它们的基本用法如下:

  1. printf 基本语句格式:printf(字符串,格式符参数);
  2. scanf 基本语句格式:scanf(字符串,变量地址列表);

使用时请包含头文件cstdio

改写 C++风格的示例:

cpp
#include<cstdio>
using namespace std;

int main(){
    int x;
    float y, z;
    printf("Please input an int number:\n");
    scanf("%d", &x);
    printf("The int number is x = %d\n", x);
    printf("Please input two float number:\n");
    scanf("%f%f", &y, &z);
    printf("The first float number is y = %f\nThe second float number is z = %f\n", y, z);

    return 0;
}

2.1 格式控制符

无论是printf还是scanf中的字符串,它们都可以包含一种被称之为格式控制符的东西,因此printfscanf也被称为格式化输入输出

什么是格式控制符呢?

C 无法分辨你需要输出或者输入的数据是什么类型的,它需要你明确的告诉它。为了明确的表明一个数据类型,格式控制符由此而来。如%d可以表示输入数据按int类型输入,或输出数据按int类型输出

2.1.1 printf 中的格式控制符

表 1 针对输出字符和字符串的转换修饰符

修饰符参数类型表示
%cchar一个单独的字符
%schar 指针该指针参数所指向的字符串

表 2 针对输出整数的转换修饰符

| 修饰符 | 参数类型 | 表示 | | ------ | ------------ | ----------------------------------- | --- | | %d,%i | int | 十进制 | | %u | unsigned int | 十进制 | | %o | unsigned int | 八进制 | | | %x | unsigned int | 十六进制,用小写的 a、b、c、d、e、f | | %X | unsigned int | 十六进制,用大写的 A、B、C、D、E、F |

表 3 针对输出浮点数的转换修饰符

修饰符参数类型表示
%ffloat十进制浮点数
%lfdouble十进制浮点数
%e、%Edouble指数表示法,十进制
%g、%Gdouble浮点数或指数表示法
%a、%Adouble指数表示法,十六进制

保留小数位数的输出

cpp
float x = 1.234;
printf("%.2f", x);    // 1.23 保留两位小数

2.1.2 scanf 中的格式控制符

scanf 函数的用法和 printf 非常相似,他们就像一对孪生兄弟,熟练掌握了 printf,那么 scanf 就不在话下,下面就简单介绍一些使用 scanf()函数的易错点。

使用 scanf 函数还必须注意以下几点:

  1. scanf 函数中没有精度控制,如:scanf("%.2f",&a);是非法的。不能企图用此语句输入小数为 2 位的实数。
  2. scanf 中要求给出变量地址,如给出变量名则会出错。如 scanf("%d",a);是非法的,应改为 scnaf("%d",&a);才是合法的。
  3. 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格、TAB 或回车作间隔。C++编译在碰到空格、TAB、回车或非法数据(如对%d输入12A时,A 即为非法数据)时即认为该数据结束。
  4. 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
修饰符参数类型表示
%dint十进制整数
%lldlong long int十进制长整型
%lluunsigned long long int十进制无符号长整型
%ffloat; double十进制浮点数
%cchar单字符
%schar 指针字符串

2.2 一个小问题

cpp
int a; char c;
scanf("%d%c", &a, &c); // 输入 `12 m`
printf("%d %c", a, c); // 输出 `12`,m哪去了?

3 换行符:endl\n

  1. endl:全称为std::endl,其中的lline的意思。
  2. \n :转义字符,表示换行。

4 getchar()putchar()

4.1 getchar

getchar()用来读取单个字符

cpp
char c = getchar();

注意事项:

  1. 输入数字也会被当作字符处理。
  2. 输入多个字符时,也只读取第一个字符。
  3. getchar 没有分隔符,它等待用户输入,直到按回车键才会结束。

4.2 putchar

putchar()用来输出单个字符

cpp
char ch = '7';
putchar(ch);   // 输出 7