ZZULIOJ 2401 小L记单词

问题 C: 小L记单词

时间限制: 1 Sec 内存限制: 128 MB
提交: 801 解决: 290
[提交] [状态] [讨论版] [命题人:541407120155]
题目描述
小L最近在努力学习英语,但是对一些词组总是记不住,小L小把这些词组中每一个单词的首字母都记一下,这样形成词组的缩写,通过这种方式小L的学习效率明显提高。
输入
输入有多行,每组测试数据占一行,每行有一个词组,每个词组由一个或多个单词组成;每组的单词个数不超过10个,每个单词由大、小写字母组成;
单词长度不超过10,由一个空格分隔这些单词。
输出
对应每一个词组,输出词组的缩写,缩写都用大写字母,每组输出占一行。
样例输入 Copy
end of file
样例输出 Copy
EOF

分析:
题目稍微有点不好写的地方在于要求的是多组输入,所以每次你要输入一行单词,如果用 cin 来输入,因为单词和单词之间有空格,而cin不能读取空格;所以可以用到c++里面的getline函数来读取一行的字符包括空格;然后储存单词的首尾,都转换为大写输出即可;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
 
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxx=1e5+7;
string s;
int main()
{
    while(getline(cin,s))
    {
        char ss[20];
        int ans=0;
        int len=s.size();
        ss[ans++]=s[0];
        for(int i=1;i<len;i++)
        {
            if(s[i]!=' '&&s[i-1]==' ')
                ss[ans++]=s[i];
        }
        for(int i=0;i<ans;i++)
        {
            if(ss[i]>=92)
            {
                ss[i]-=32;
            }
            printf("%c",ss[i]);
        }
        cout <<endl;
    }
    return 0;
}

顺便补充一下两个点

1

getline()

getline()的原型是istream& getline ( istream &is , string &str , char delim );
istream &is 表示一个输入流,譬如cin
string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,也就是回车换行符(遇到回车停止读入)。给大家举个例子:

string line;
cout<<"please cin a line:"
getline(cin,line,'#');
cout<<endl<<"The line you give is:"line;

那么当我输入"You are the #best!" 的时候,输入流实际上只读入了"You are the ",#后面的并没有存放到line中(应该是在缓冲区里吧)。然后程序运行结果应该是这样的:

please cin a line:You are the #best!
The line you give is:You are the

而且这里把终止符设为#,你输入的时候就算输入几个回车换行也没关系,输入流照样会读入,譬如
please cin a line:You are the best!
//这里输入了一个回车换行
Thank you!
#//终止读入

The line you give is:You are the best!
//换行照样读入并且输出
Thank you!

2

c++中的toupper() 和 **tolower()**两个函数;

**toupper()**和英文意思差不多,向上的意思,作用为处理一个单字符,将其变成大写字母;
**tolower()**顾名思义向下,也就是将一个单字符变成小写;
应用很简单;

比如上面的题换个处理方式:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>

using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxx=1e5+7;
string s;
char ss[20];//我把数组定义在外面了,为了不用循环一次把字符串输出
int main()
{
    while(getline(cin,s))
    {
        memset(ss,0,sizeof ss);//每次对数组进行初始化;
        int ans=0;
        int len=s.size();
        ss[ans++]=toupper(s[0]);
        for(int i=1;i<len;i++)
        {
            if(s[i]!=' '&&s[i-1]==' ')
                ss[ans++]=toupper(s[i]);
        }
        printf("%s\n",ss);
    }
    return 0;
}

刚才写的时候总是输出乱码,我用

cout<<ss<<endl;
printf("%s",ss);

仔细看了一下,原来如果我把数组定义在我的程序while里面了,会自动赋予计算机内部的乱码地址;所以我把他定义外面就ok了;全局变量可以自动初始化;

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值