2 条题解

  • 0
    @ 2025-11-27 12:12:39
    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        string s;
        getline(cin,s);//这样才能把空格一起读进来
        int cnt=0;
        for(int i=0;i<s.size();i++){
            if(s[i]!=' '||s[i]!='\n'){
                cout<<s[i];
            }
        }
        cout<<cnt<<endl;
    }
    
    • 0
      @ 2025-11-27 12:12:24

      P5015 这道题(NOIP 2018 普及组 T1)是当年的“送分题”,非常简单。但是,它考察了一个 C++ 初学者最容易忽视的细节:如何处理空格

      1. 核心难点:空格会“截断”输入

      题目要求统计标题字符数,但不包含空格和换行。 如果你习惯性地使用 cin >> s(假设 sstringchar 数组),你会遇到问题。

      • 场景:输入 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
      上传者