строка — C ++ Atoi захватывает значения других символов, созданных в той же части программы

Я пытаюсь прочитать строку из 9 символов в 9 целочисленных значений, которые будут сохранены в массиве (на данный момент я сохраняю их в 9 отдельных целых числах, помещу их в массив, как только они прочитают в ОК). Общий подход, который я взял: con строка, разделить ее на 9 символьных значений, преобразовать (atoi) каждое в целое число и сохранить как 9 ints, поместить int в массив. Что странно, в то время как отдельные значения без проблем разбиваются на отдельные символы, поверх как-то «видит» другие соседние значения (вообще не содержащиеся в этом символе!) И преобразует их в обратном направлении.

образец кода:

countrows = 1;
countcols = 1;
cout << endl << "Enter values for boxes in row " << countrows << ", enter 0 for open boxes (enter 9 numbers, with no spaces or delimiters): ";
string inputline;
cin >> inputline;
char col1, col2, col3, col4, col5, col6, col7, col8, col9;
int int1, int2, int3, int4, int5, int6, int7, int8, int9;
col1 = inputline[0];
col2 = inputline[1];
col3 = inputline[2];
col4 = inputline[3];
col5 = inputline[4];
col6 = inputline[5];
col7 = inputline[6];
col8 = inputline[7];
col9 = inputline[8];
int1 = atoi(&col1);
int2 = atoi(&col2);
int3 = atoi(&col3);
int4 = atoi(&col4);
int5 = atoi(&col5);
int6 = atoi(&col6);
int7 = atoi(&col7);
int8 = atoi(&col8);
int9 = atoi(&col9);
cout << "inputline: " << inputline << endl;
cout << "col1: " << col1 << " col2: " << col2 << " col3: " << col3 << endl; //debug line
cout << "int1: " << int1 << " int2: " << int2 << " int3: " << int3 << endl; //debug line

результат этого:

Введите значения для полей в строке 1, введите 0 для открытых полей (введите 9 цифр без пробелов и разделителей): 456123789
строка ввода: 456123789
col1: 4 col2: 5 col3: 6
int1: 4 int2: 54 int3: 654

почему int содержит 5 и int3 65 (должно быть int1: 4 int2: 5 int3: 6)

0

Решение

atoi используется для преобразования строк с нулевым символом в конце (char *), а не символов в целое число Ваш col1, col2, не являются завершенными NULL строками, а atoi будет читать память до тех пор, пока она не достигнет значения NULL (что завершит строку).

Если вы хотите изменить цифры ASCII на числа, вы можете использовать простую математику:

int1 = col1 - '0';

col1: 4 col2: 5 col3: 6 int1: 4 int2: 54 int3: 654

Все эти значения хранятся в стеке. Давайте предположим, что стек в настоящее время пуст (это не так, есть другие локальные адреса, адрес возврата и тому подобное), а верхний элемент равен 0:

 STACK
----------
0           <- top

Теперь ваш col1, col2, col3 помещаются в стек, как вы их объявляете:

 STACK
----------
0
col1
col2
col3

И, как только вы дадите им значения, вы получите следующую картину:

 STACK
----------
0
'4'
'5'
'6'

Когда вы звоните atoi(col1) это будет читать '4', а потом, 0, который завершит строку и проанализирует только ASCII '4', Когда вы звоните atoi(col2)будет читать '5', '4', а потом 0поэтому входная строка будет "54" так что разберу именно так. Подобное случится для всех остальных col переменные.

Обратите внимание, что нет ничего волшебного в чтении элементов стека в обратном порядке — на самом деле, вы читаете память в прямом порядке — потому что на моем (и, вероятно, вашем) стеке машин растет вниз. На некоторых машинах это было бы не так (проверьте эта ссылка для более подробной информации), и вы получите 456... за col1 или, возможно, просто ноль (atoi вернет ноль, если вы передадите не-числовую строку в качестве аргумента).

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector