题解 | 简写单词|调半天....

简写单词

https://www.nowcoder.com/practice/0cfa856bf0d649b88f6260d878f35bb4

#include<iostream>
#include<cstring>
using namespace std;
int main() {
   string s;
   getline(cin,s);
   int len=s.length();
   for(int i=0;i<len;i++)
   {
        if((i==0)||(i>=1&&s[i-1]==' '))
        {
            if(s[i]>='A'&&s[i]<='Z')
                cout<<s[i];
/*为什么cout<<s[i]-32输出的是ascll而不是字符?答案是:s[i] 的类型是 char,而 32 的类型是 int。
当你执行 s[i] - 32 时,s[i] 会被提升为 int 类型,整个表达式的结果也是 int 类型。
cout 输出 int 类型时,会将其作为整数打印,而不是字符。*/
            else cout<<(char)(s[i]-32);
        }
   }
}

这里错了两个地方,一开始死活调不明白,还是后来想了很久之后才想出来的....

最大的问题:读入的时候只用cin,空格直接导致读入中断(所以你的ICPC只有一个I....)

默认的cin >>会把空格、换行符等当作分隔符,只读取到第一个空格为止

怎样输入字符串可以把空格也读入?

方法 1:使用getline()读取整行(最常用)getline(cin, str) 会读取从当前位置到换行符(\n)的所有字符,包括空格、制表符,且不会包含最后的换行符,是读取带空格字符串的首选。c

// 读取整行,包含所有空格,直到按下回车
getline(cin, str);
//对了我发现str.size()和str.length()等价欸!
 str.size() << endl;

注意:避免cin和getline()混用的坑:

如果先使用cin >>读取其他类型(如整数),再用getline(),会因为cin >>留下的换行符导致getline()直接读取空字符串。

解决方法是用cin.ignore()清空缓冲区

cin >> n; // 读取整数后,缓冲区会留下换行符
// 清空缓冲区的换行符(关键!)
cin.ignore(numeric_limits<streamsize>::max(), '\n');

cout << "请输入带空格的字符串:";
getline(cin, str); // 现在能正常读取了

cout << "整数:" << n << endl;
cout << "字符串:" << str << endl;
return 0;

方法 2:使用cin.get()逐个字符读取(灵活控制)cin.get() 会读取单个字符(包括空格、换行符),可以循环读取直到满足终止条件(比如换行、指定字符),适合需要逐字符处理的场景

// 循环读取每个字符,直到遇到换行符
while ((ch = cin.get()) != '\n') {
    str += ch; // 把每个字符(包括空格)添加到字符串
}
cout << "读取的字符串:" << str << endl;
return 0;

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务