c++ - 为什么需要在索引中添加 '0' 才能访问数组值?

标签 c++ char indices character-set

我对这一行感到困惑:

sum += a[s[i] - '0']; 

为了给出一些上下文,这是代码的其余部分:

#include <iostream>

using namespace std;

int main() {

    int a[5];
    for (int i = 1; i <= 4; i++)
        cin >> a[i];
    string s;
    cin >> s;
    int sum = 0;
    for (int i = 0; i < s.size(); i++)
        sum += a[s[i] - '0'];
    cout << sum << endl;
    return 0;
}

最佳答案

- '0'(或便携性较差的- 48,仅适用于ASCII)用于通过数字字符的十进制代码,C++ (和 C) 保证所有编码中的连续数字。

EBCDIC ,例如,代码范围从 '0'240'9'249,这将使用 - '0' 可以正常工作,但使用 - 48 会失败)。 仅出于这个原因,最好始终像您一样使用 - '0' 表示法

以 ASCII 为例,如果 '1' 的 ASCII 码是 49 并且 '0' 的 ASCII 码是 4849 - 48 = 1,或采用推荐的格式'1' - '0' = 1

所以,正如您现在可能已经想到的那样,您可以使用这个简单的算术将字符中的所有 10 位数字转换为它是通过添加 '0' 进行字符编码。

除了代码中还有一些其他问题:

  • 数组不会在索引 0 处开始填充,而是在索引 1 处开始填充,因此如果您的字符串输入例如是 "10" sum 将是 a[1] + a[0],但 a[0]没有赋值,所以 behaviour is undefined ,您需要注意这些情况。
for (int i = 0; i < 5; i ++)
    cin >> a[i];

会更合适,索引从04,因为数组有5个索引,如果你想输入1到5的数字,你可以减去1 稍后从 到索引。

  • 正如评论部分所指出的,错误的输入(例如字母字符)也会引发未定义的行为。

关于c++ - 为什么需要在索引中添加 '0' 才能访问数组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60994353/

相关文章:

c++ - 如何使用正则表达式解析 SIP 消息的多行 header ?

c++ - 是否因为以下原因在堆中实例化一个对象?

c++ - QT 连接 - "No such slot"错误

kotlin - 是什么让 Kotlin 中的 String 类能够使用方括号?

python - 根据另一个列表或数组查找数组/列表中元素的索引

c++ - QTreeView 合并一些单元格

java - 我的isbn检查器有什么错误?

c++ - 代码给出 ASCII 数字而不是字符

c++ - 从 cin 中只读取一个字符

Python 在数组/列表中查找数据索引,但有约束