P1308统计单词数
#include<bits/stdc++.h>
using namespace std;
#include <stdio.h>
#include <string.h>
#define maxn 90
void strlower(char *a){
for(int i=0;a[i];i++){
if(isupper(a[i]))a[i]=tolower(a[i]);
}
}
int main(){
char a[1000001],b[11],*q,*p;//当前搜索到的指针,最后一次搜索到的指针
gets(b);
gets(a);
bool flag=false;
int ans=0,ans1=-1;//个数,首个出现的位置
int len=strlen(b);
strlower(a);//转换大小写
strlower(b);
p=a;
for(;q=strstr(p,b);) {
if(q!=NULL&&(q==a||*(q-1)==' ')&&(*(q+len)=='\0'||*(q+len)==' ')){
ans++;
if(flag==false){
ans1=q-a;//指针-数组首地址=指针下标
flag=true;
}
}
p=q+len;
}
if(flag==true)
cout<<ans<<' '<<ans1;
else cout<<ans1;
}
- 大小写字母转换函数,判断 isupper(),转小写 tolower();
- 查找字符串b是否存在于字符串a中,p为指针,指向a,q=strstr(p,b),q为出现的首地址
- 循环查询是否存在,改变首地址位置,p=q+len
- 在文章中查找词组,确保位置*(q-1)是空格或 *q是首地址,单词长度后是空格或结尾
- 输出字符在数组中的位置,ans1=q-a,当前指针-数组首地址=下标位置
用string类型
int main(){
//定义两个字符串
string a;
string b;
//用string库,调用getline, 直接读入一整行
getline(cin,a);
getline(cin,b);
//转换大小写,可以都转换为大写,或者小写
for (int i=0;i<a.length();++i){
a[i]=tolower(a[i]);
}
for (int i=0;i<b.length();++i){
b[i]=tolower(b[i]);
}
//因为连起来的不算,所以要在前后加几个空格,一定要是同样多的,同量减同量,等于同量
a=' '+a+' ';
b=' '+b+' ';
//先看看会不会找不到,用a.find()和string::npos
if (b.find(a)==string::npos){
cout<<-1<<endl;
}
//如果找得到
else {
int alpha=b.find(a);
int beta=b.find(a),s=0;//计数器初始化为0
while (beta!=string::npos){
++s;//计数器
beta=b.find(a,beta+1);
}
cout<<s<<" "<<alpha<<endl;//输出第一个和总共有几个
}
//函数返回值为0,结束整个程序
return 0;
}
-
查找字符串a是否包含子串b,用 strA.find(strB) != string::npos
-
beta=b.find(a,beta+1);从上一次出现的位置开始(a,beta+1),beta+1是新位置
-
a=’ ‘+a+’ ‘; b=’ ‘+b+’ '; 统一格式,保证查找时是标准单词
-
a.length()是字符串长度
-
getline(cin,a),输出字符串
P1588垂直柱状图
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[200];
int maxn=0,ff[26]={0},n;
for(int i=0;i<4;i++){
gets(a);
n=strlen(a);
for(int j=0;j<n;j++){
if(a[j]>='A'&&a[j]<='Z') ff[a[j]-'A']++;//isalpha判断字母
}
//cout<<a;
}
//for(int i=0;i<26;i++)cout<<ff[i]<<' ';
for(int i=0;i<26;i++)maxn=max(maxn,ff[i]);//循环找最大值
for(int i=maxn;i>0;i--){
for(int j=0;j<26;j++){
if(ff[j]>=i)cout<<"*";
else cout<<" ";
if(j!=25)cout<<" ";
}
cout<<'\n';
}
for(int i=0;i<26;i++)printf("%c ",i+'A');//%串,顺序输出字母
}