2 条题解
-
0
P5015 这道题(NOIP 2018 普及组 T1)是当年的“送分题”,非常简单。但是,它考察了一个 C++ 初学者最容易忽视的细节:如何处理空格。
1. 核心难点:空格会“截断”输入
题目要求统计标题字符数,但不包含空格和换行。 如果你习惯性地使用
cin >> s(假设s是string或char数组),你会遇到问题。- 场景:输入
Ca 45 - 使用
cin >> s:程序只会读入Ca,遇到空格就停止了。如果你只统计这个s的长度,答案是 2,但正确答案应该是 4(C,a,4,5)。
2. 解决方案一:读整行(推荐,通用性强)
既然中间有空格,我们就不能用普通的
cin读取字符串,而是要一次性把整行读进来(包含空格),然后再一个个检查。- 读取方式:使用
getline(cin, s)。- 这个函数会读取一整行,直到遇到换行符才停止,空格也会被读进字符串
s里。
- 这个函数会读取一整行,直到遇到换行符才停止,空格也会被读进字符串
- 统计方式:
- 写一个
for循环遍历字符串s。 - 检查每一个字符
s[i]。 - 如果
s[i]不等于 空格 (' '),计数器就加 1。
- 写一个
3. 解决方案二:巧用
cin的特性(最快,最聪明)这道题有一个非常巧妙的“偷懒”写法。 题目正好要求不统计空格和换行,而
cin在读取char类型或者string类型时,默认特性就是自动跳过空格和换行!- 思路:
- 我们不需要把这一行存下来,也不需要管它长什么样。
- 我们只需要一个字符一个字符地读,只要读到了东西,就说明它肯定不是空格(因为空格被
cin自动吞掉了)。
- 代码逻辑:
注意:这种方法在本地调试时,输入完后需要手动按char c; int ans = 0; // 只要还能读入字符,循环就继续 // cin >> c 会自动跳过空格 while (cin >> c) { ans++; } cout << ans;Ctrl+Z(Windows) 或Ctrl+D(Linux/Mac) 来告诉程序“输入结束了”,否则循环不会停。但在 OJ 上提交是没问题的。
4. 总结
这道题虽然简单,但它是很好的试金石:
- 如果你想练习字符串操作,建议用 方案一 (
getline),因为以后很多题目需要保留空格。 - 如果你想追求代码简短,方案二 是针对这道题的特解。
去试试吧!注意不要统计到空格哦。
- 场景:输入
- 1
信息
- ID
- 3809
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者