void main()
{
string s, Letter;
cin >> s;
int count[26], i, s_i;
for (i = 0; i < 26; i++)
count[i] = 0;
int n = sizeof(s);
for (i = 0; i < n; i++)
{
s_i = s[i] - 'a';
count[s_i]++;
}
for (i = 0; i < 26; i++)
{
if (count[i] != 0)
{
Letter = 'a' + i;
cout << Letter << " : " << count[i] << endl;
}
}
}
这是一个计算字符串数量的程序。 s_i = s [i] - &#39; a&#39;是什么意思? ?特别是,为什么要使用 - &#39; a&#39;?还有其他方法来计算信件吗?
答案 0 :(得分:1)
表达式x - 'a'
为您提供x
中的字符值与字母表的第一个小写字母之间的距离。
例如:
'b' - 'a'== 1
'c' - 'a'== 2
编辑1:更简单的方法
声明您的计数数组有256个插槽
使用该字符作为数组的索引
增加索引处的值。
例如:
unsigned int counts[256];
char c = 'b';
//...
counts[c] += 1;
使用减法,x - 'a'
允许更小的数组。
编辑2:更便携的解决方案
更便携的解决方案,不依赖于编码,是使用包含字母表的字符数组。搜索字符,如果找到,则索引是字符的偏移量。
char c = 'j';
const std::string lowercase_alphabet = "abcdefghijklmnopqrstuvwxyz";
const std::string uppercase_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
unsigned int counts[26] = {0};
//...
unsigned int index = lowercase_alphabet.find(c);
if (index != std::string::npos)
{
++counts[index];
}
else
{
index = uppercase_alphabet.find(c);
if (index != std::string::npos)
{
++counts[index];
}
}
相同的概念可以应用于字符数组而不是std::string
类型。
注意:toupper
和tolower
函数不用于避免本地化开销。
答案 1 :(得分:0)
几点需要注意:
该程序假定字符串仅包含LowerCase字母(a-z),而不包含任何其他内容。因此,26 possible character
[a-z]
通过执行-'a'
,我们只是从'a'
中减去s[i]
的ascii值。每个字符都有一个唯一的ascii value。在编译期间,编译器检查'a'
的ascii值,并用-'a'
替换-48
。我们可以完成-'a'
而不是-48
,但在这种情况下,我们不需要记住'a'
的ascii值。
[a-z]
的所有ascii值都是连续的。 a's
值为48,z's
值为57.因此,通过s[i]-'a'
,我们可以了解ith varaible
与a
之间的区别。< / p>
最后Letter = 'a' + i;
完成了原始角色。