我不知道什么"return ch[c-'A'];&return ch[c-'1'+26];"做的。以下是c++中uva401 - Palindromes的一些代码。
char ch[36]={'A',' ',' ',' ','3',' ',' ','H','I','L',
' ','J','M',' ','O',' ',' ',' ','2','T',
'U','V','W','X','Y','5','1','S','E',' ',
'Z',' ',' ','8',' '};
char rev(char);
char rev(char c){
if (isalpha(c)){
return ch[c-'A'];//this line I don't know what it means.
} else {
return ch[c-'1'+26];//this line I don't know what it means.
}
}
我猜写这个函数的人是assume
- ASCII或兼容字符集,AND;
- 输入
'1'
和'9'
之间的大写字母或数字
在这些假设下,c - 'A'
将大写字母从'A'
映射到0
,'B'
映射到1
,'C'
映射到2
, ....'Z'
到25
和c-'1'+26
将数字'1'
映射到26
,'2'
映射到27
, ....'9'
to34
.
问题是这两个假设都不能保证为真。
有一些真实世界的字符集不是ASCII(并且没有大写字母作为连续的字符集)。
即使使用ASCII(兼容)字符集,代码中也没有任何内容阻止调用者向函数传递超出映射有意义的输入范围的值。
编写更清晰和可读的代码并不难,检查输入是否有效,进行(大概)预期的映射,并且即使在不支持ASCII(或兼容)字符集的实现中也能按预期运行。我将把编写这样的代码作为练习。
c++中的Char变量也用ASCII值表示,例如,ASCII中的'A'是65。因此,如果char c = 'B'在ASCII中等于65,按字母顺序递增,则c - 'A'意味着66 - 65等于1。然后将该值1用作数组ch的索引,遍历该索引处的元素。
char ch[36]={'A',' ',' ',' ','3',' ',' ','H','I','L',
' ','J','M',' ','O',' ',' ',' ','2','T',
'U','V','W','X','Y','5','1','S','E',' ',
'Z',' ',' ','8',' '};
int c = 'B';
cout << ch[c - 'B']; //Output: A
所有字符变量的ASCII表
c++中的字符由8位整数表示(暂时不考虑比ASCII更复杂的东西)。例如,'a'
为97
,'z'
为122
。
可以用它们做数学运算,它们被自动强制转换为整数。数组是按数字索引的,所以我们可以使用这个数学运算的结果来查找数组中的条目。
设'A'
为65
。如果我们从另一个大写字符中减去这个数字,我们就会得到字母表中有多少个字符。所以'E' - 'A'
求值为4
。