算法竞赛读入数据相关操作

读入带空格的字符串

char str[1024];
scanf("%[^\n]",&str); // 读取到'\n'为止,不读入'\n'
getchar(); // 清除'\n'

int num;
string str;
cin >> num;          // 读取数字
cin.ignore();        // 跳过数字后的'\n'
getline(cin, line);  // 读取整行输入,包括换行符'\n',但'\n'不会存储在 line 中。

循环读入

// 快速读取整数(C风格)
int num;
while (scanf("%d", &num) != EOF) { ... }

// 逐字符读取
char ch;
while ((ch = getchar()) != EOF) { ... }

int num;
string line;

// 读取数字
while (cin >> num) { ... }

// 读取行
while (getline(cin, line)) { ... }

快读

int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}

// 使用:
int a = read();
long long b = read();

scanf 的高级用法

(1) 扫描集 %[] —— 读取特定字符

  • %[abc]:只读取 ab 或 c,遇到其他字符停止。
  • %[^abc]:读取直到遇到 ab 或 c 为止。
  • %[^\n]:读取整行(直到 \n,但不包括 \n)。c复制char str[100]; scanf(“%[^\n]”, str); // 读取一行(不含换行符) getchar(); // 吃掉残留的 \n注意%[^\n] 不会自动限制长度,容易缓冲区溢出,建议用 %99[^\n] 限制。
char str[100];
scanf("%[^\n]", str); // 读取一行(不含换行符)
getchar(); // 吃掉残留的 \n

(2) 跳过输入 %*

  • %*d:读取但不存储整数(跳过该输入)。
int a, b;
scanf("%d %*d %d", &a, &b); // 输入 "1 2 3",a=1, b=3(跳过 2)

(3) 宽度限制 %Ns

  • %5s:最多读取 5 个字符(防止缓冲区溢出)。
char name[10];
scanf("%9s", name); // 最多读 9 个字符(留 1 位给 '\0')

(4) 混合输入数字和字符串

  • scanf 不会自动跳过空白字符(如 \n ),需要手动处理:
int a;
char c;
scanf("%d", &a);    // 读取整数
scanf(" %c", &c);   // 注意前面的空格,跳过空白符

(5) 检测输入结束(EOF)

  • scanf 返回成功读取的变量个数,EOF 表示输入结束:
int num;
while (scanf("%d", &num) != EOF) {
    // 处理 num
}

printf 的高级用法

(1) 格式化输出

格式作用示例输出
%5d固定宽度 5 位(右对齐)printf("%5d", 123);123
%-5d固定宽度 5 位(左对齐)printf("%-5d", 123);123
%05d不足 5 位补 0printf("%05d", 123);00123
%.2f保留 2 位小数printf("%.2f", 3.14159);3.14
%x / %X十六进制(小写/大写)printf("%x", 255);ff
%o八进制printf("%o", 8);10
%p指针地址printf("%p", &a);0x7ffd...

(2) 动态指定宽度/精度

  • 用 * 动态传入宽度或精度:
int width = 5, precision = 2;
printf("%*.*f", width, precision, 3.14159); // 输出 " 3.14"

(3) 输出 % 符号

  • 用 %% 输出 %
printf("Success rate: 100%%"); // 输出 "Success rate: 100%"

(4) 打印字符串(限制长度)

  • %.5s:只打印前 5 个字符:
printf("%.5s", "Hello World"); // 输出 "Hello"

(5) 对齐 + 填充

  • 左对齐 + 填充 -
printf("%-10s", "Hello"); // 输出 "Hello     "
  • 右对齐 + 填充 0
printf("%05d", 42); // 输出 "00042"
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇