【问题描述】
在一个单词或者一个句子中,如果每个字母都至少出现过一次,则称为全字母短句。
输入若干句子,请判断这些句子是否为全字母短句。
【输入形式】
输入的第一行为T,表示有T个测试用例,接下来的T行,每行为一个句子。
【输出形式】
输出有T行,每行对应一个测试用例的输出,如果该句子为全字母短句,输出"Yes",
如果为不是全字母短句,则输出"No"以及所缺失的字母(大写,按字母序),以空格分隔。
【样例输入】
3 toosmallword TheQuickBrownFoxJumpsOverTheLazyDogs. Airplanes from Turkey and the United Arab Emirates (UAE) landed Sunday in Islamabad carrying temporary shelters, food and other daily necessities.
【样例输出】
No B C E F G H I J K N P Q U V X Y Z Yes No J Q V W X Z
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char S[]= {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
char s[]= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int T;
cin>>T;
string str;
for(int k=0; k<T; k++) //T个用例的循环输入与输出
{
int flag1,flag2,temp=1;
getline(cin,str); //调用getline的好处,见下面解释
cin.ignore(); //输入缓冲区的释放
for(int i=0; i<26; i++)
{
for(int j=0; j<str.size(); j++)
{
if((str[j]==S[i])||(str[j]==s[i]))
{
flag1=1;
break;
}
else
flag1=0;
}
if(flag1==0)
{cout<<"No"<<" ";
break;}
}
for(int m=0; m<26; m++)
{
for(int n=0; n<str.size(); n++)
{
if((str[n]==S[m])||(str[n]==s[m]))
{
flag2=1;
break;
}
else
{
flag2=0;
}
}
if(flag2==0)
{
temp=0;
cout<<S[m]<<" ";
}
if(m==25)
cout<<endl;
}
if(temp==1)
{
cout<<"Yes"<<endl;
}
}
}
害!我刚写这个作业的时候不知道该拿输入的空格怎么办,直到我遇见了它——getline()
getline()函数的用法介绍:
虽然可以使用 cin 和 >> 运算符来输入字符串,
当 cin 读取数据时,
一旦它接触到第一个非空格字符即开始阅读,
当它读取到下一个空白字符时,它将停止读取
即cin 不能输入包含嵌入空格的字符串
为了解决这个问题,
可以使用一个叫做 getline 的 C++ 函数。
此函数可读取整行,包括前导和嵌入的空格,
并将其存储在字符串对象中。
PS:
在使用getline读入一整行时,
若是前面是使用getchar()、cin这类读入了一个字母,
但是不会读入后续换行\n符号或者空格的输入时,再接getline()就容易出现问题。
这是因为输入数字之后,敲回车,产生的换行符仍然滞留在输入流了,
接着就被getline(cin,s)给读进去了,
此时的s=“\n”,所以实际上s只是读入了一个换行符\n。
而若是前面使用getline(),再又用getline()进行读入,此时不会发生问题。
getline()中读入结束的回车后,结束符不放入缓存区,会将读入的\n直接去除,
下一个输入前,缓冲区为空,并不会因为回车留下\n。
而cin的结束后,以及getchar()此类的读入结束后,按下回车或者使用空格读入下一个,
此时按下的回车或空格会还在缓存区,继续用getline()就会出现前面所提到的情况。
那么如何解决前面用了cin、getchar()后的输入呢?
可以直接在cin和getchar()后使用一个getchar()吃掉接下来的换行,也可以通过cin.ignore()进行缓冲区的释放