题目描述
在英语中,依靠单词的大小写拼写复合词的做法,叫做"骆驼拼写法"(CamelCase)。比如,backColor这个复合词,back第一个字母b为小写,color的第一个字母为大写。
这种拼写法在正规的英语中是不允许的,但是在编程语言和商业活动中却大量使用。比如,sony公司的畅销游戏机PlayStation,play和station两个词的词首字母都是大写的。
“骆驼拼写法"又分为两种。第一个词的首字母小写,后面每个词的首字母大写,叫做"小骆驼拼写法”(lowerCamelCase);第一个词的首字母,以及后面每个词的首字母都大写,叫做"大骆驼拼写法"(UpperCamelCase),又称"帕斯卡拼写法"(PascalCase)。
它之所以被叫做"骆驼拼写法",是因为大小写的区分使得复合词呈现"块状"(bump),看上去就像骆驼的驼峰(hump)。
这种变量命名方法非常适合于编程时的变量命名。
现在给你 N N N行单词,要求你把每行单词按照小骆驼拼写法的规则进行拼写,然后输出。
输入描述
第一行一个数字 N ( 0 ≤ N ≤ 100 ) N(0\leq N\leq100) N(0≤N≤100),表示行数,之后有 N N N行。
每行有不定数目的单词,以空格分隔。
每个单词由不定长度的英文字母(A~Z,a ~z)组成。
输入描述
N N N行,表示输出
示例1
输入 |
---|
4 |
user name |
pass word |
get message from HTTP response |
find minimum path |
输出 |
userName |
passWord |
getMessageFromHttpResponse |
findMinimumPath |
题目大意
每一行有多个单词,第一个单词的首字母小写,其他单词的首字母大写,其他所有字符都变为小写。
解题思路
刚开始的时候想的是对于每一行的每个单词都单独输入,但是这样自己没有找到如何判读结束一行的输入。所以索性每一个的所有字符都读入到字符串中(包括空格)。遍历一遍字符串,如果某个字母的前一个字符是空格的话,那么这个字母肯定是某个单词的首字母,特判一下字符串的第一个字符便好。
AC代码
#include <bits/stdc++.h>
#define INF 0x3f3f3f
using namespace std;
const int mod=1e8+7;
const int Max_N=5e2+5;
typedef pair<int,int>P;
typedef long long ll;
typedef unsigned long long ull;
int main(int argc, char const *argv[])
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
getchar();
while(n--)
{
string s,res;
getline(cin,s);
int len=s.size();
s[0]=tolower(s[0]);
res+=s[0];
for(int i=1;i<len;i++)
{
if(s[i-1]==' ')
{
s[i]=toupper(s[i]);
res+=s[i];
}
else if(s[i]!=' ')
{
s[i]=tolower(s[i]);
res+=s[i];
}
}
cout<<res<<endl;
res.clear();
}
return 0;
}
总结
这道题遇到三个细节问题。 第一个就是如何选择输入方式,第二个就是做题太仓促以至于样例都没有看清楚,以为除了首字母以外其他字符都不用改变。第三个就是 g e t l i n e ( c i n , s ) getline(cin,s) getline(cin,s)会把空格和回车读入,输入 n n n之后会有一个回车符,应该用 g e t c h a r ( ) getchar() getchar()来舍去回车符。