题解 | 简写单词|调半天....
简写单词
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;