格式化输入输出

在 C++ 中,scanfprintf 是 C 语言标准输入输出库中的函数,用于格式化输入和输出。虽然在 C++ 中更常用 cincout,但这两个函数仍然广泛使用,尤其是需要高性能或格式化控制时。

1. printf – 格式化输出

用于将数据按指定格式输出到标准输出(通常是屏幕)。

常用格式说明符

  • %d:整数(十进制)
  • %f:浮点数
  • %c:字符
  • %s:字符串
  • %lf:双精度浮点数(C99/C++ 中 %f 也可用于 double
  • %x:十六进制整数

示例

 #include <iostream>
 using namespace std;
 int main() {
     int a = 42;
     double b = 3.14159;
     char c = 'A';
     const char* s = "Hello";
 ​
     printf("整数:%d\n", a);           // 整数:42
     printf("浮点数:%.2f\n", b);       // 浮点数:3.14 (保留两位小数)
     printf("字符:%c\n", c);           // 字符:A
     printf("字符串:%s\n", s);         // 字符串:Hello
     printf("十六进制:%x\n", a);       // 十六进制:2a
 ​
     return 0;
 }

2. scanf – 格式化输入

用于从标准输入(通常是键盘)读取数据并按照格式解析。

注意要点

  • 传入的变量地址需要使用 & 取地址符(字符串数组名本身是地址,不需要 &
  • 返回值是成功读取的项目数,可用于错误检查

示例

 #include <iostream>
 using namespace std;
 int main() {
     int age;
     double salary;
     char name[50];
 ​
     printf("请输入姓名、年龄和工资(用空格分隔):");
     // 注意:字符串数组 name 不需要 &
     int result = scanf("%s %d %lf", name, &age, &salary);
 ​
     if (result == 3) {
         printf("姓名:%s\n年龄:%d\n工资:%.2f\n", name, age, salary);
    } else {
         printf("输入格式错误!\n");
    }
 ​
     return 0;
 }

对比 C++ 的 cin/cout

特性scanf/printfcin/cout
类型安全不安全(类型不匹配可能导致运行时错误)安全(类型在编译时检查)
性能通常更快(尤其大量数据时)较慢(默认与 C 流同步,可关闭)
易用性需要记忆格式符更简单直观
扩展性不支持自定义类型(除非用 C11 扩展)支持运算符重载

控制宽度对比

 #include <bits/stdc++.h>
 using namespace std;
 int main(){
     int a=15,b=3355,c=9;
     // 输出三个数字,用空格隔开,每个数字占8个宽度,最后换行
     cout<<setw(8)<<a<<" "<<setw(8)<<b<<" "<<setw(8)<<c<<endl;
     printf("%8d %8d %8d\n",a,b,c);
 }

控制精度对比

 #include <bits/stdc++.h>
 using namespace std;
 int main(){
     double d=1.2345678;
     // 保留四位小数输出
     cout<<fixed<<setprecision(4)<<d;
     printf("%.4lf",d);
 }

自动填充对比

 #include <bits/stdc++.h>
 using namespace std;
 int main(){
     int e=45;
     // 默认宽度5,不够填充0
     cout<<setw(5)<<setfill('0')<<e; // 00045
     printf("%05d",e); // 00045
 }

输入控制巧妙结合题目

 // 输入日期,格式:y-m-d
 int y,m,d; // 年月日
 scanf("%d-%d-%d",&y,&m,&d);
 ​
 // 输入时间,格式:h:m:s
 int h,m,s; // 时分秒
 scanf("%d:%d:%d",&h,&m,&s);


格式说明符详解

格式:%[标记][长度][.精度]类型

  • 标记:默认右对齐
    • -代表左对齐
    • 0代表空位补零
  • 长度:代表数据至少占位的宽度
  • 精度:代表保留小数位数,需要添加.,且类型是浮点型
  • 类型:
    • int:d
    • float:f
    • double:lf
    • char:c
    • long long:lld
    • 科学计数法:e
    • 八进制:o
    • 十六进制:x

转义符号对比

 // 用cout输出带引号的单词"hello", \"代表要输出"而非字符串两端的标记
 cout<<"\"hello\""; // "hello"
 // 用cout输出\, \\ 代表要输出\
 cout<<"\\"; // \
 // 用printf输出5%,%%代表要输出%而非匹配某个数据
 printf("%d%%",5); // 5%