char* topic возвращает строку с содержимым "текст/текст/число(от 0-128)" Как можно считать число в конце строки в int?
Asked
Active
Viewed 146 times
2 Answers
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;
}
Vanyamba Electronics
- 2,693
-
пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав [edit] – aleksandr barakin Jan 30 '22 at 08:19
-
1
-
@wololo в Arduino не очень большая RAM, чтобы работать с длинными строками. – Vanyamba Electronics Jan 30 '22 at 11:39
-
я правильно понимаю что данный пример разбирает основываясь на нахождении "/"? – Diminator Jan 31 '22 at 11:57
-
std::string? – 4500zenja Jan 26 '22 at 17:45