Неожиданный вывод, если введены отрицательные числа - PullRequest
0 голосов
/ 26 октября 2019

Я работаю над проектом CS, и меня смущает какой-то аспект кода.

Я пытался использовать '0', чтобы удалить значение символа, хранящееся в fDig и sDig, чтобы вместо этого содержать целые числабайтов символов, но каким-то образом тогда, когда я сделал расстояние отрицательным сам по себе, cerr зачитал какое-то случайное число, которое не предназначено снова.

    else{
                int fDig = commandString[i+1+extra]-'0';
                int sDig = commandString[i+2+extra]-'0';
                int distance = fDig;


                if (isdigit(commandString[i+2])){distance = (fDig*10 + sDig);}
                if (extra == 1){distance = -distance;}

                cerr << distance << endl;
}

Например, если commandString при i + 1 + extra равно 3, иcommandString в i + 2 + extra - ничто, а extra - 1. Я получаю значение 18 в качестве вывода для расстояния.

1 Ответ

0 голосов
/ 31 октября 2019

Вычитание '0' волшебным образом не превращает символ в строке в целое число.

Вычитая '0', вы вычитаете из значения ASCII, чтобы получить смещение из ASCII 0:

'0' - '0' = 0x30 - 0x30 = 0
'1' - '0' = 0x31 - 0x30 = 1
'2' - '0' = 0x32 - 0x30 = 2
'3' - '0' = 0x33 - 0x30 = 3
...
'9' - '1' = 0x39 - 0x30 = 9

Однако, если у вас есть данные для мусора (которые при вводе пользователем, вы всегда должны предполагать, что они есть), вы получите результаты для мусора:

'-'  - '0' = 0x2d - 0x30 = -3
' '  - '0' = 0x20 - 0x30 = -16
'\0' - '0' = 0x00 - 0x30 = -48 (string terminator)
'\n' - '0' = 0x0a - 0x30 = -38

В стандартной библиотеке C / C ++ есть многоинструменты, написанные, чтобы сделать это для нас.

Не беспокойтесь о разборе ASCII, если вы не АБСОЛЮТНО знаете, что делаете.

Для одного числа я предлагаю strtollдля строк C и stoll для std::strings или для нескольких чисел в одной строке sscanf и istringstream.

Они обрабатывают шестнадцатеричные, отрицательные, восьмеричные, лишние пробелы и обрабатывают ошибки, если вы используете его правильно, и намного, намного, намного проще, чем ручной анализ.

...