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

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

21.07.2021, 16:25. Показов 5489. Ответов 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_
5208 / 2925 / 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
6136 / 2830 / 1039
Регистрация: 01.06.2021
Сообщений: 10,314
21.07.2021, 19:01  [ТС]
DrOffset, ваш код будет быстрее цикла с проверкой isdigit?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,194
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.07.2021, 19:07
Цитата Сообщение от Royal_X Посмотреть сообщение
ваш код будет быстрее цикла с проверкой isdigit?
Смотря что за цикл.
Помимо собственно цикла вам еще придется учитывать разрядность. Не любое число записанное в тексте поместится в int.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,194
21.07.2021, 19:09
Цитата Сообщение от Royal_X Посмотреть сообщение
ваш код будет быстрее цикла с проверкой isdigit?
Невозможно сделать "метод, который будет возвращать false, даже если присутствует хотя бы один символ, не являющийся цифрой" быстрее, чем сделать в какой-то форме цикл с проверкой isdigit.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6136 / 2830 / 1039
Регистрация: 01.06.2021
Сообщений: 10,314
21.07.2021, 19:24  [ТС]
TheCalligrapher, я в C++ плохо разбираюсь. Есть ли в C++ функция, которая проверяет string регулярными выражениями? Например, в Java можно было бы myString.matches(String regex) .
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
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
4198 / 2653 / 654
Регистрация: 23.09.2014
Сообщений: 8,947
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru