从字符数组的元素中减去'a'是什么意思

What's the meaning of subtracting 'a' from elements of char array

本文关键字:意思 是什么 数组 字符 元素      更新时间:2023-10-16
  1. a[s1[i] - 'a']
  2. int a[26] = {0}(我不确定,但它是否用于将数组的每个元素初始化为 0 值(
int main()
{
char s1[10010], s2[10010];
cin >> s1 >> s2;
int a[26] = {0};
for(int i = 0; i < strlen(s1); i++)
a[s1[i]-'a']++;
for(int i = 0; i < strlen(s2); i++)
a[s2[i]-'a']--;
long long int ans = 0;
for(int i = 0; i < 26; i++)
ans += abs(a[i]);
cout << ans << endl;
return 0;

}

这意味着有人在做假设。您可以使用表示整数的字符来执行此操作:c - '0'将为您提供对应于字符'0''1'、'2'、...'9'。这是由语言定义保证的。对于任何其他字符值,没有此类保证。因此,此代码猜测c - 'a'将生成一个数值,该数值以某种方式反映c表示的字符。在最常见的字符编码中,它有效;在ASCII中,这是迄今为止使用最广泛的,如果c表示小写字母,则c - 'a'映射'a'到0,'b'映射到1,...,'z'映射到25。但是有些字符表示是不正确的。

但请注意,此代码不执行任何输入验证。如果有人键入了"Z"、"0"或";"(仅举几例(,生成的索引将超出数组边界,并且可能会发生不好的事情。

至于int a[26] = {0};,这称为聚合初始化。数组是一个聚合,也就是说,它包含多个值。表单的初始值设定项{something}something复制到聚合中的第一个元素,并将其余元素设置为 0。因此int a[26] = {0};数组的所有 26 个元素a设置为 0。

聚合初始化中的初始值设定项不必具有值 0。int a[26] = {3};会将数组的第一个元素(a[0](设置为3,数组的其余元素设置为0。

聚合初始化不限于单个值。您可以拥有任意数量的值,用逗号分隔。因此,int a[26] = { 1, 2, 3 };将前三个元素分别设置为 1、2 和 3,其余元素设置为 0。如果初始值设定项多于元素,则忽略多余的初始值设定项。

通常,表达式(cchar(

c - 'a'

用于取范围 ['a''z'] 中的字符(由于其在英文字母表上的根,大小为26(并计算该字母的索引(例如'a'0'b'1,等等(。


同样,当您看到:

c - '0'

它通常用于计算 [09] 范围内的字符的"数字"值,例如'5'(字符(映射到5(整数(。

> 1(a是一个包含 26 个条目的数组,字母表中每个字母对应一个条目。但是字符'a'的值与 0 不同,因此要获取数组的第 n 个字母,您需要s1[i]-'a'.

2(int a[26] = {0}数组的第一个元素中放一个零,然后默认初始化其余元素(意味着整数也为零,所以请注意它不会做你认为它做的事情(,我会说使用std::vector<int> a(26, 0);代替。您仍然可以使用int a[26] = {}0s 初始化它,并明确表示您了解{0}只会将数组的第一个元素初始化为此值,而不是整个数组:http://www.cplusplus.com/doc/tutorial/arrays/

当然,该程序仅在仅输入小写字母时才有效。如果输入了任何其他内容,则程序的行为是未定义的,并且可能会崩溃。

int a[26] = {0};

它只是初始化名为"A"的数组中所有项目,带有零。 使用大括号初始化语法初始化内置类型数组时,可能会发生两种类型的初始化。如果初始值设定项少于数组大小,则使用相应的值初始化前 N 个元素,并使用默认构造函数初始化其余元素。对于内置类型,默认构造函数执行零初始化。

a[s1[i] - 'a']

内部字符是简单的十进制数字。每个字符都有与之关联的唯一代码。(见 https://en.m.wikipedia.org/wiki/ASCII( 如果数组 "s1" 包含小写拉丁符号,则s[i]在位置 "i" 处获取符号。然后我们从符号s1[i]的代码中减去符号'a'的代码,得到符号s1[i]的字母顺序数(从零开始计数(。例如:'a'-'a' = 0'b' - 'a' = 1然后我们使用计算的"数字"来访问数组"a"中位置"数字"的元素

a[s1[i] - 'a']

s1[i]减去 ascii 值 'a' 将是a[]的索引。 确保s1[i]大于字符的 ASCII 值。

关于下面,第一个元素将设置为 0

int a[26] = {0};