Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793

Проверить string на содержание в нем целого числа

21.07.2021, 16:25. Показов 5549. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему нельзя проверить, что string text содержит число следующим образом (код не работает):

C++
1
if (stoi(text) != invalid_argument)
ведь,

stoi("45") → 45
stoi("3.14159") → 3
stoi("31337 with words") → 31337
stoi("words and 2") → invalid_argument

Какой самый быстрый способ проверки текста на наличие в нем целого числа вы знаете? Желательно такой метод, который будет возвращать false, даже если присутствует хотя бы один символ, не являющийся цифрой. Имею ввиду, чтобы "3.14159" и "31337 with words" тоже возвращались false.

Думал в сторону isdigit() из <cctype>, но неужели придется проверять все символы циклом?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.07.2021, 16:25
Ответы с готовыми решениями:

String: запись целого числа
Дана строка. Если она представляет собой запись целого числа, то вывести 1, если вещественного (с дробной частью) — вывести 2; если строку...

Даны три произвольных числа, проверить, является ли хотя бы одно из этих чисел квадратом целого числа
Даны три произвольных числа A,B,C. Если хотя бы одно из этих чисел является квадратом целого числа, то вывести на экран сообщение...

Написать процедуру, которая для целого числа возвращает сумму цифр в нем
Написать процедуру, которая для целого числа возвращает сумму цифр в нем

13
Модератор
Эксперт CЭксперт С++
 Аватар для Volga_
5209 / 2926 / 1509
Регистрация: 14.12.2018
Сообщений: 5,266
Записей в блоге: 1
21.07.2021, 17:08
Лучший ответ Сообщение было отмечено Royal_X как решение

Решение

Royal_X,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str;
    cout << "Enter string:" << endl;
    getline(cin, str);
    int len = str.size();
    bool flg = true;
    for (int i = 0; i < len; i++)
    {
        if (!isdigit(str[i]))
        {
            flg = false;
            break;
        }
    }
    if (flg)
    {
        int m = stoi(str);
        cout << m;
    }
    else
    {
        cout << "Error !";
    }
    system("pause");
    return 0;
}
Цитата Сообщение от Royal_X Посмотреть сообщение
но неужели придется проверять все символы циклом?
Посмотрите break; в цикле выше.

Добавлено через 34 минуты
Или можно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    int n;
    cout << "Enter number: ";
    while (!(cin >> n) || (cin.peek() != '\n'))
    {
        cin.clear();
        while (cin.get() != '\n');
        cout << "\tError! Repeat...." << endl;
        cout << "Enter number: ";
    }
    cout << "n = " << n << endl;
 
    system("pause");
    return 0;
}
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
21.07.2021, 17:10
C++
1
2
3
std::string string = /* тут текст */;
auto subrange = string | std::views::drop_while(isdigit);
return std::ranges::size(subrange) != string.size();
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
21.07.2021, 17:20
Цитата Сообщение от Royal_X Посмотреть сообщение
Какой самый быстрый способ проверки текста на наличие в нем целого числа вы знаете?
Цитата Сообщение от Royal_X Посмотреть сообщение
"31337 with words" тоже возвращались false
не путайте проверку текста на наличие в нем целого числа и проверку введённого значения на то, является ли оно целым числом

текст "31337 with words" содержит целое число

что именно Вас интересует ?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
21.07.2021, 18:57
Royal_X, на библиотечных средствах можно вот так сделать:
C++
1
2
3
4
5
bool check_int(std::string const & s) {
    char * p = nullptr;
    std::strtol(s.c_str(), &p, 10);
    return p == &s[s.size()];
}
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
21.07.2021, 19:01  [ТС]
DrOffset, ваш код будет быстрее цикла с проверкой isdigit?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
21.07.2021, 19:07
Цитата Сообщение от Royal_X Посмотреть сообщение
Почему нельзя проверить, что string text содержит число следующим образом (код не работает):
Так а почему должно быть можно? Откуда взялся такой вопрос? Функция stoi не занимается "проверкой, что string text содержит число".

Добавлено через 2 минуты
Цитата Сообщение от Royal_X Посмотреть сообщение
Желательно такой метод, который будет возвращать false, даже если присутствует хотя бы один символ, не являющийся цифрой
C++
1
std::all_of(std::begin(text), std::end(text), isdigit);
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
21.07.2021, 19:07
Цитата Сообщение от Royal_X Посмотреть сообщение
ваш код будет быстрее цикла с проверкой isdigit?
Смотря что за цикл.
Помимо собственно цикла вам еще придется учитывать разрядность. Не любое число записанное в тексте поместится в int.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
21.07.2021, 19:09
Цитата Сообщение от Royal_X Посмотреть сообщение
ваш код будет быстрее цикла с проверкой isdigit?
Невозможно сделать "метод, который будет возвращать false, даже если присутствует хотя бы один символ, не являющийся цифрой" быстрее, чем сделать в какой-то форме цикл с проверкой isdigit.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
21.07.2021, 19:24  [ТС]
TheCalligrapher, я в C++ плохо разбираюсь. Есть ли в C++ функция, которая проверяет string регулярными выражениями? Например, в Java можно было бы myString.matches(String regex) .
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
21.07.2021, 19:28
Royal_X, регулярные выражения всяко будут медленнее, чем все вышеперечисленное.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
21.07.2021, 19:44
Цитата Сообщение от Royal_X Посмотреть сообщение
Есть ли в C++ функция, которая проверяет string регулярными выражениями?
Если вопрос стоит в том, что "начинается ли строка с цифры или не с цифры" и требует максимально быстрого определения, то регулярные выражения будут в десятки если не сотни раз медленнее. Но так можно проверять и по ним - https://en.cppreference.com/w/... gex_search
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
21.07.2021, 19:47
Цитата Сообщение от DrOffset Посмотреть сообщение
std::strtol
а оно, вроде, пробелы пропускает впередиидущие, они ж не цифры; с другой стороны он берёт и отрицательные (что, кмк, хорошо), вроде ж тоже числа, но с символом.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
std::all_of(std::begin(text), std::end(text), isdigit);
О, это покрасивше std::find_if_not(...) == str.end();

Короче, мож так ещё как-нибудь, с "минусом":
C++
1
2
3
4
5
6
bool check(const std::string &str)
{
    auto bgn = str.begin() + (str[0] == '-');
    if(bgn == str.end()) return false;
    return std::all_of(bgn, str.end(), isdigit);
}
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,080
Записей в блоге: 3
21.07.2021, 20:11
[вар1]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <numeric>
 
bool is_integer(std::string s)
{   bool r = s.size() != 0;
    return std::accumulate (s.begin(), s.end(), r, 
           [](bool x, char y){return x && std::isdigit(y);});
}
 
int main()
{   std::cout << is_integer("12534") << '\n';
    std::cout << is_integer("12.34") << '\n';
}
[вар2]
(попытка ускорить)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
 
struct Is_integer
{      Is_integer()
       {   memset(m, 0, sizeof m);
           for(char c = '0'; c <= '9'; ++c) m[c] = true;
       }
    bool operator()(std::string s)
    {   auto   i  = s.begin();
        for (; i != s.end  () && m[*i]; ++i);
        return i == s.end  () && s.size() != 0;
    }
    bool m[256];
}is_integer;
 
 
int main()
{   std::cout << is_integer("12534") << '\n';
    std::cout << is_integer("123.3") << '\n';
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2021, 20:11
Помогаю со студенческими работами здесь

Необходимо реализовать функцию, которая для заданного целого числа меняет порядок цифр в нем на обратный
Необходимо реализовать функцию, которая для заданного целого числа меняет порядок цифр в нем на обратный. Продемонстрировать работу...

Проверить является ли число квадратом целого числа
такой вопрос: как сделать условие - если квадратный корень выражения целочисленный -&gt; выполняется действие

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

Проверить симметричность десятичных цифр целого числа
Есть класс class MyAuto { private: char Name; char Surname; char Brand; int Number; int Price;

Проверить является ли заданное число квадратом целого числа
Проверьте,является ли заданное число N квадратом целого числа.Если заданное число является квадратом целого числа,то выведите корень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru