У меня возникает уникальная проблема, с которой я раньше не сталкивался, при преобразовании char в int в C ++.

Я просматриваю строку целых чисел под названием total_line, которая читается как:

1526

Я пытаюсь преобразовать любой другой символ в int, и вот мой код:

cout << total_line[i+1] <<endl;
int d = total_line[i+1] <<endl;
cout << d << endl;
i++;

Мой вывод странно такой:

5
53
6
54

Я не уверен, почему 5 преобразуется в int 53, а 6 преобразуется в int 54.

1
Melynda Anne Sherrill 15 Апр 2016 в 00:48

4 ответа

Лучший ответ

Как уже упоминалось, символы фактически представлены как числа, которые отображаются в таблице символов. Преобразование числа в символы различается в зависимости от выбранной кодировки, например , для US-ASCII символы '1' и '2' соответствуют числам 49 и 50 (см. здесь полную таблицу US-ASCII).

Чтобы преобразовать строковое представление числа в целое число со знаком, используйте {{X0 }} (начиная с C ++ 11).

Следующий фрагмент кода разделит строку на отдельные цифры и использует std::stoi для преобразования их в числа, соответственно.

for (std::string::size_type i = 0, n = total_line.size(); i != n; ++i) {
    int d = std::stoi(total_line.substr(i, 1));

    std::cout << d << std::endl;
}

Преимущество использования функции стандартной библиотеки std::stoi заключается в том, что она работает независимо от кодировки символов.

3
Snps 14 Апр 2016 в 22:57

Просто посмотрите на таблицу ascii (man ascii в Linux)

     Oct   Dec   Hex   Char
     ---------------------
     060   48    30    0
     061   49    31    1
     062   50    32    2
     063   51    33    3
     064   52    34    4
  -> 065  |53|   35   |5|
  -> 066  |54|   36   |6|
     067   55    37    7 
     070   56    38    8 
     071   57    39    9  

Итак, вы можете видеть, что причина, по которой 5 преобразуется в 53 и 6 в 54, заключается в том, что десятичное значение char '5' равно не 5, а 53 (то же с 6).

Если вы хотите преобразовать char в int, попробуйте что-то вроде этого:

int d = total_line[i] - '0';

Я не буду рекомендовать вам это:

int d = total_line[i] - 48;

Из-за переносимости (спасибо Питу Беккеру) и не все знают десятичное значение «0» и прямое использование «0», я думаю, более понятно.

2
Mathieu Van Nevel 14 Апр 2016 в 22:53

Эта строка выглядит очень странно:

int d = total_line[i+1] <<endl;

Что там делают потоки operator<< и endl?

Почему бы просто не сделать это?

int d = total_line[i+1];
0
abelenky 14 Апр 2016 в 21:51

Вам нужно читать с позиции i вместо i+1, а также во второй строке был лишний endl. Вы получаете значения ASCII символов, которые вы пытаетесь прочитать. Чтобы преобразовать их в int, вам нужно вычесть из него значение ASCII "0". А также, если вы работаете в цикле for, вам не нужно явно увеличивать i. Возможно, поэтому вы пропускаете символы

Это может помочь:

cout << total_line[i] <<endl;
int d = total_line[i];
cout << d - '0' << endl;
0
Pooya 14 Апр 2016 в 22:25