В С++ одинаковы ли s[i] - '0' и atoi()?

atoi() и s[i] - '0' одинаковы?

int countSubstrings(string s, int n)
{
    int count = 0, sum = 0;

    unordered_map<int, int> mp;
    mp[0]++;

    for (int i = 0; i < n; ++i) {

        sum += (s[i] - '0');
          cout << sum << endl;
        count += mp[sum - (i + 1)];
        ++mp[sum - (i + 1)];
    }
    return count;

Можем ли мы в приведенном выше коде использовать функцию atoi() вместо s[i] - '0'?


person Robot    schedule 18.08.2020    source источник
comment
atoi() предназначен для преобразования многосимвольной строки в число, s[i] - '0' — только для одной цифры.   -  person Barmar    schedule 18.08.2020
comment
Вы имеете в виду замену именно s[i]-0 на atoi? Весь цикл делает больше, чем просто преобразование строки в целое число.   -  person cigien    schedule 18.08.2020
comment
Нет, ты не можешь. Поскольку цикл вычисляет сумму каждого отдельного символа в строке, вместо этого atoi будет вычислять значение всей строки (c_str()).   -  person Sir Jo Black    schedule 18.08.2020
comment
Или std::from_chars, если вы хотите быть самым крутым ребенком в классе.   -  person    schedule 18.08.2020


Ответы (1)


Нет, так заменить нельзя.

Аргумент atoi() должен быть строкой в ​​стиле C, заканчивающейся нулем. s[i] — это одиночный символ, а не строка. Поэтому, если вы хотите использовать atoi(), вам сначала нужно создать строку для хранения символа.

char digit[2] = "";
digit[0] = s[i];
sum += atoi(digit);
person Barmar    schedule 18.08.2020