用 fgets 按 255 字符缓冲区整行读入,单遍扫描统计 ASCII 数字字符个数。
OJ: roj
题目 ID: 1129
难度:入门
标签:字符串输入输出python
创建: 2026-09-29 20:16
更新: 2026-10-05 02:53
题目描述
输入一行字符串,字符集含大小写字母、数字、空格与英文标点,长度不超过 255。统计其中 '0' 到 '9' 字符的个数并输出。
思路
整行读入后只统计前 255 个字符,从左到右扫描,遇到 ASCII 数字字符就计数。缓冲区大小为 256 字节时实际最多保存 255 个可见字符,与官方参考实现的读取语义一致。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 20:16
# update_at: 2026-09-29 20:16
import sys
MAX_LEN = 255 # 题面保证字符串总长度不超过 255,超长部分按 std.cpp 的缓冲区规则不参与统计
def solve() -> None:
line = sys.stdin.buffer.read().decode() # 一整行输入:字母、数字、空格与标点混合
# 只保留前 255 个字符,再数其中落在 '0'~'9' 的字符;str.isdigit() 会把上标等
# 非 ASCII 数字也算进来,故显式比较区间。
kept = line[:MAX_LEN]
count = sum('0' <= ch <= '9' for ch in kept)
print(count)
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2025-01-20 21:30
* update_at: 2026-10-05 02:53
*/
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
char s[260]; // 读入缓冲区,fgets 最多保留 255 个可见字符
int main() {
// 用 fgets 模拟官方参考实现:缓冲区 256 字节(含 '\0'),最多读入 255 个字符
if (fgets(s, 256, stdin) == NULL) {
printf("0\n");
return 0;
}
ll ans = 0;
ll len = strlen(s);
for (ll i = 0; i < len; i++) {
if (s[i] >= '0' && s[i] <= '9') ans++;
}
printf("%lld\n", ans);
return 0;
}