新手守护
题目描述 Description
现在有一行英文句子,里面包含大小写字母以及空格,字母个数(包含空格)不超过10万。
请你统计这个句子中每个字母出现的个数(不需要统计空格的个数)。
按照a~z的顺序输出。
第一行输出小写字母的个数
第二行输出大写字母的个数
输入描述 Input Description
输入一个整数n(n不超过100000),
第二行是总长度为n英文句子,包含大小写字母和空格
输出描述 Output Description
输出两行
第一行输出每个小写字母的个数空格隔开,a~z的顺序
第二行输出每个大写字母的个数空格隔开,A~Z的顺序
样例输入 Sample Input
17 I love Codingtang
样例输出 Sample Output
a 1 d 1 e 1 g 2 i 1 l 1 n 2 o 2 t 1 v 1 C 1 I 1
我的错误代码:
#include <iostream>
using namespace std;
int b[155];
int main(){
int c;
cin>>c;
string a;
cin>>a;
getline(cin,a);
for(int i=0;i<=a.size();i++){
b[int(a[i])]++;
}
for(int i=97;i<=122;i++){
if(b[i]>0){
cout<<(char)i<<" "<<b[i]<<" ";
}
}
cout<<endl;
for(int i=65;i<=90;i++){
if(b[i]>0){
cout<<(char)i<<" "<<b[i]<<" ";
}
}
return 0;
}
请各位大佬们看看哪里错了?
||我的输出错了||
初级光能
首先,在你的字符读取过程中,有问题。你先用了 “cin >> a;” 然后又用了 “getline(cin, a);” 这导致你刚才从 cin 读入的字符被 getline 读取的字符替换掉了。你可能需要去掉 “cin >> a;” 这行代码,只用 getline 来获取整行输入。
其次,归类字母时,ASCII码的范围应当是 a(小写)在97-122, A(大写)在65-90,而不是你给出的97-123和65-88,你需要修改这两个循环的边界值。
最后,在字符统计的循环中,你使用的是小于等于 size 的方式,实际上数组索引是从0到size-1,所以你需要修改循环条件为"i<a.size()"。