0

char* topic возвращает строку с содержимым "текст/текст/число(от 0-128)" Как можно считать число в конце строки в int?

  • А нельзя ли записать эту строку в виде std::string? – 4500zenja Jan 26 '22 at 17:45
  • вместо char? Я получаю char* topic от готовой библиотеки mqtt. Или я не так понял? – Diminator Jan 26 '22 at 20:47

2 Answers2

2

Если же topic должен быть с типом только char*, но при этом число число достаточно маленькое, то тогда можно просто пройтись по строке с конца с помощью цикла for, затем заносить в число-результат каждую цифру с конца, умножая её на 10^(число цифр вместе с данной цифрой).

#include <iostream>
#include <ctype.h>
#include <cmath>
#include <cstring>

int main() { const char* text = "text/text/124"; int res = 0, digits = 0; // int degree = 1; for (size_t i = strlen(text) - 1; text[i] != '/'; i--) { if (isdigit(text[i])) { // если цифра, то выполняем прибавление res += (text[i] - '0') * pow(10, digits++); // res += (text[i] - '0') * degree; // degree *= 10; } } std::cout << res; }

4500zenja
  • 3,923
  • Спасибо. Отлично работает! Один момент, можно проверку добавить что в конце получаемой строки text действительно число, а то если попадает текст он также принимает числовые значения. – Diminator Jan 26 '22 at 20:43
  • 2
    pow(10, digits++) — неоправданное привлечение арифметики с плавающей точкой в целочисленную задачу. Даже если аргументы целочисленные и точный результат возведения в степень представим типом double, то не гарантируется, что этот точный результат будет получен. И недружелюбные реализации pow существуют. – wololo Jan 26 '22 at 21:23
  • @Diminator по идее Ваша строка всегда имеет вид, указанный в условии, т.е. нецифр справа быть не должно. Но всё же на всякий пожарный добавлю проверку на цифру – 4500zenja Jan 27 '22 at 09:01
  • @wololo спасибо за информацию, довольно необычно это дело выглядит. Я думал, в основном pow() в плюсах более-менее стабильно работает, ан нет... В общем, добавил вариант, не зависящий от double – 4500zenja Jan 27 '22 at 09:07
  • Если значение text[i] не представимо типом unsigned char и не равно EOF, то поведение выражения isdigit(text[i]) не определено. – wololo Jan 30 '22 at 09:02
0
uint8_t get_number(char* topic) {
   uint8_t n = 0;
   while (topic[n] != '/') ++n;
   ++n;
   while (topic[n] != '/') ++n;
   ++n;
   uint8_t result = 0;
   while (topic[n] != 0) result = result * 10 + topic[n] - '0';
   return result;
}