Как превратить строку в int с более чем 1 цифрой в c ?

#c #arrays #string #c 11 #integer

#c #массивы #строка #c 11 #целое число

Вопрос:

Это мой код

 for (unsigned int i = 0; i < form.size(); i  )
    if (isdigit(form[i]))
       {
            value=form[i] - '0';
            operand.push(value)   //this is a stack
       }
 

но это работает только тогда, когда у вас есть int из 1 цифры, допустим, строка формы имеет 1, она работает просто отлично, но когда строка получает 10, она не будет работать, потому что сначала она установит значение в 1, затем в 0 и не получит число 10, есть ли способсделать это внутри цикла for? Я не могу использовать atoi, потому что иногда строка может содержать символы типа ‘/’ или ‘*’, и мне нужно поместить их в другой стек. я хотел бы знать, есть ли способ заставить переменную value содержать целое число 10.
Я должен сохранить целые числа и операторы из строки. Получение числа 1, а затем 0 не является проблемой, проблема заключается в преобразовании 2 целых чисел в одно многозначное целое число 1 0 в 10, 2 5 в 25 и так далее.

Комментарии:

1. Да, есть способ, но вам нужно проделать больше работы. По сути, вам нужно прекратить обработку строки по одному символу за раз. Например, когда вы находите цифру, вы можете затем просмотреть строку вперед, чтобы увидеть, сколько цифр у вас есть, а затем преобразовать их все сразу, а затем поместить объединенное значение в стек.

2. Обязательно ли реализовывать алгоритм? Или вы можете использовать стандартную библиотеку?

3. Если это присваивание, вам, вероятно, придется создать посимвольный анализатор.

4. @john это звучит очень похоже на то, что использование an std::stringstream дало бы вам бесплатно.

5. Ну, если atoi() у вас это не работает, поднимите его на ступеньку выше и используйте strtol() : помимо возвращаемого значения, он обновляет конечный указатель, чтобы вы знали, где что осталось, если третий аргумент не является — nullptr (вам также нужно будет передать базе третий аргумент).

Ответ №1:

 for (int i = 0, temp = 0; i <= form.size(); i  ) {
  if (i == form.size() || !isdigit(form[i])) {
    operand.push(temp);
    temp = 0;
  }
  temp = (temp * 10)   form[i] - '0';
}