2016-01-09 5 views
2

Мне интересно, могу ли я преобразовать часть моей строки в целое число с помощью static_cast? Я знаю, что существует что-то вроде atoi(), но должен ли я использовать его, чтобы передать только первый символ моей строки в целое число?Часть преобразования строк в целое число - C++

int w; 
string my_str; 
getline(cin, my_str); 
w = static_cast<int>(my_str[0]) - 48; 

Правильно ли это? Или я должен делать это по-другому?

+0

Тот факт, что @Marvin отредактировал этот вопрос, и '48' настолько близок к' 42', меня очень забавляет :) – Ziezi

+0

'my_str [0]' будет возвращать 'char', поэтому его включение в int излишний. –

ответ

5

Как долго вы уверены, что my_str[0] содержит символ цифры, это нормально.

Вы должны избегать магических чисел как 48 хотя, лучше написать w = my_str[0] - '0';

Номер 48 является ASCII-код числовое представление '0'. Существуют и другие character code systems (например, коды EBCDIC), а языки c или C++ не имеют явного представления об этих понятиях, и числовые представления могут полностью отличаться.

Сказанное с использованием '0' будет переносимым для многих кодовых систем символов, а не только кодов ASCII.

+0

Но почему - '0'? Когда я сделал это, используя char [] вместо строки, я написал «- 48», и это было правильно. – whatfor

+0

@Monika Это представление символов ASCII 48. Час обрабатывается как числовые значения. Вам даже не понадобится 'static_cast '. –

+0

Итак, если -'0 'означает - 48, не могу ли я использовать этот второй вариант? – whatfor

4

Нет необходимости использовать static_cast, потому что в любом случае поощрение целых чисел применяется к выражению my_str[0] типа char. Таким образом, эти два выражения

static_cast<int>(my_str[0]) - 48; 

и

my_str[0] - 48; 

эквивалентны.

Это правильно, если вы хотите преобразовать только один символ строки. В противном случае вы должны использовать стандартную функцию stoi.

Кроме того, вместо магического числа 48 гораздо лучше использовать литеру '0'

my_str[0] - '0'; 

, потому что это более понятным и ясным, и не зависит от используемой системы кодирования. Например, в EBCDIC код нуля равен 0xF0.

0

Ваш бросок возвращает код ascii вашего первого символа. И вам действительно не нужен бросок. my_str[0] - '0' выполняет эту работу.

Если это что-то между «0» и «9», это работает так, как вы этого хотите. Но вы должны проверить результат. Потому что, если этот символ является чем-то вне границы, вы получите отрицательный результат или число за 9 в результате

+0

Я не знаю, что содержит my_str [0], потому что пользователь программы может писать там, что захочет.Но после этого и после преобразования я проверяю, является ли это правильным значением (мне нужно значение между «1» и «5») 'int wybor; do { wybor_opcji.clear(); getline (cin, wybor_opcji); wybor = static_cast (wybor_opcji [0]) - 48; } while ((wybor_opcji [0] <'1') || (wybor_opcji [0]> '5')); ' Правильно ли он проверяет внутри while(), или должен ли я использовать« 1 »и« 5 »с помощью« »? – whatfor

+0

Это хорошо выглядит. Поскольку вы преобразовываете char в integer, почему бы вам не использовать значение 'wybor' в вашем состоянии while? например: 'while ((wybor <1) || (wybor> 5));' –

1

В общем, вам лучше использовать '0', а не 48.

Хотя верно, что представление ASCII (или совместимых представлений) используется чаще всего на практике, существуют стандартизованные наборы символов с '0', которые численно не равны 48.

Существует также аргумент читаемости. Труднее простого смертного понять код, используя магические числа, такие как 48.Это облегчает понимание того, что делает x - '0' за x - 48.

0

Компьютеры могут понимать только цифры, поэтому символ на клавиатуре (и другие) представлены с использованием системы кодирования , где каждый символ присваивается уникальный номер.

Строки представляют собой последовательности символов, где, как мы сказали, каждый символ представлен числом. В случае, когда представление символа (например, ASCII) включает в себя выравнивание цифр '0' по 9 последовательно начиная с '0'.

Если у вас есть символ, цифра, вычитая '0'«преобразует» его это цифра значение, поскольку выражение в вашем случае:

w = static_cast<int>(my_str[0]) - 48; 

выполняет вычитание между числами int представляющие значения символов. Где десятичное значение: 48 однозначно представляет символ '0' .

static_cast<int> является излишним, поскольку вся правая часть состоит из целых чисел

Примечания: вычитание '0' старый трюк для преобразования используемых людей, которые действительно знали, что компьютеры были всеми о, в отличии от нас.


1. Пример стандарта кодирования является ASCII.

2. '0' in ASCII = 48 // in Decimal.

P.S .: Вопрос был бы еще лучше, если номер 42 был ASCII код Числовое представление '0', то каждый ответ был бы очень интересно читать.