Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
[progeR]
29 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 601
#1

Извлечь число из строки - C++

06.09.2014, 17:08. Просмотров 1872. Ответов 42
Метки нет (Все метки)

Добрый день.
Есть строка, например, вида:
Код
field001600.bin
Из нее нужно извлечь число 1600 (т.е. без ведущих нулей). Подскажите, как это делается на C++?
На PHP это делается за 0.5 сек, например, с помощью регулярных выражений.

Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2014, 17:08     Извлечь число из строки
Посмотрите здесь:

Извлечь из строки числа C++
C++ извлечь биты и вывести в виде двоичного кода число на языке С
Как из числа double 4.056 извлечь число 1000? C++
C++ Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с первого бита
C++ Парсинг адресной строки, хочу извлечь индекс и название города
Из положительных элементов извлечь квадратный корень, отрицательные возвести в квадрат, нулевые заменить на число В C++
Как извлечь только цифры из строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
08.09.2014, 23:06     Извлечь число из строки #21
Цитата Сообщение от [progeR] Посмотреть сообщение
что это ДОЛЖНО быть неотъемлемой часть языка тем более общего назначения)
и почему же это? этот функционал легко добавляется с помощью библиотек, и это помоему лучше чем все пихать в стандарт
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1709 / 1142 / 270
Регистрация: 05.06.2014
Сообщений: 3,307
08.09.2014, 23:43     Извлечь число из строки #22
и почему же это? этот функционал легко добавляется с помощью библиотек, и это помоему лучше чем все пихать в стандарт
С помощью библиотек добавляется костыль. Как это выглядит в Перле (да, без подключения каких либо библиотек):
Perl 6
1
2
3
$text="field001600.bin";
$text=~/\d+/;
print $&;
Как это будет выглядеть на C++:
C++
1
2
3
4
5
6
7
8
9
10
11
#include<regex>
#include<string>
using namespace std;
int main()
{
    regex exp("\\d+");
    smatch match;
    string text="field001600.bin";
    regex_search(text,match,exp);
    cout<<match[0]<<endl;
}
Краткость и элегантность прям из всех щелей прет. А сейчас я вам интереснее фокус покажу: перебор всех чисел в строке.
Perl 6
1
2
3
4
$text="1234 5678 9012";
while($text=~/\d+/g){
    print "$&\n";
}
И попробуйте это сделать также элегантно в C++.
[progeR]
29 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 601
09.09.2014, 20:11  [ТС]     Извлечь число из строки #23
Нашел sscanf, делаю это:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cstdio>
 
using namespace std;
 
int main()
{
    char str[]="dump001560_0.7050997";
    int step;
    double z;
    sscanf(str, "dump%6d_%lf", &step, &z);
    cout << step<< " " << z << endl; 
    return 0;
}
Шаг выводит нормально, а z криво. Вместо того, что было 0.7050997, он выводит 0.7051.
Если будет так:
C++ (Qt)
1
char str[]="dump001560_1200.7050997";
Выводит 1200.71.

Есть способ излечения C++ от этого недуга?
marina2
Рожденная для битвы
 Аватар для marina2
271 / 49 / 4
Регистрация: 08.11.2009
Сообщений: 1,019
09.09.2014, 20:42     Извлечь число из строки #24
возможно с помощью функции форматированиz setw()
http://msdn.microsoft.com/ru-ru/library/8bbhbaew.aspx
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
09.09.2014, 20:54     Извлечь число из строки #25
[progeR],
C++
1
2
3
4
5
6
7
8
9
int main()
{
    char str[]="dump001560_0.7050997";
    int step;
    double z;
    sscanf(str, "dump%6d_%lf", &step, &z);
    cout << step<< " " << std::setprecision(10) << z << endl;
    return 0;
}
KOPOJI
Модератор
 Аватар для KOPOJI
16613 / 6554 / 408
Регистрация: 12.06.2012
Сообщений: 19,637
Завершенные тесты: 1
09.09.2014, 21:36     Извлечь число из строки #26
Цитата Сообщение от Renji Посмотреть сообщение
Как это выглядит в Перле
И что с того? На руби и того короче будет выглядеть
Ruby
1
2
text = "field001600.bin"
puts /\d+/.match text
Ruby
1
2
text="1234 5678 9012";
text.scan(/\d+/) {|n| puts n}
Это что, означает, что плюсы УГ, а руби/питон форевер?
Renji
1709 / 1142 / 270
Регистрация: 05.06.2014
Сообщений: 3,307
09.09.2014, 22:42     Извлечь число из строки #27
Это что, означает, что плюсы УГ, а руби/питон форевер?
Это означает что нормальные регулярные выражения должны поддерживаться на уровне синтаксиса, а не на уровне библиотек. Строки, кстати, тоже. А то ведь даже строку с числом по человечески ("N="+N) сложить нельзя. И вряд ли будет можно пока существует неоднозначность "это число или символ?".
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
09.09.2014, 23:00     Извлечь число из строки #28
Цитата Сообщение от KOPOJI Посмотреть сообщение
Это что, означает, что плюсы УГ, а руби/питон форевер?
Это должно означать, что каждому инструменту свое место. И если задача требует использовать perl, значит надо использовать perl, а не фрустрировать на тему того как в С++ все многословно.

Цитата Сообщение от Renji Посмотреть сообщение
И вряд ли будет можно пока существует неоднозначность "это число или символ?".
Она всегда будет существовать. Если сделать так, чтобы она не существовала - это будет уже совсем другой язык. Лучше просто перестать тянуть С++ за уши в ту область (массивная обработка текстов), где существуют инструменты специально для этого предназначенные.
KOPOJI
Модератор
 Аватар для KOPOJI
16613 / 6554 / 408
Регистрация: 12.06.2012
Сообщений: 19,637
Завершенные тесты: 1
09.09.2014, 23:04     Извлечь число из строки #29
Renji, они не нужны в плюсах, как таковые. В вебе да, довольно часто используются.
Цитата Сообщение от Renji Посмотреть сообщение
А то ведь даже строку с числом по человечески ("N="+N) сложить нельзя
Если вам не нравится статическая типизация - то так и скажите. Зато нет глупых ошибок, распространенных в языках с динамической типизацией - где переменную логического типа сравнивают со строкой "false"/"true".
И да, кстати, следуя вашей логике, руби одновременно и УГ, и супер. Регулярки поддерживаются отлично, а вот сложить так строку с числом - ошибка, надо перевести в строку.. Железная аргументация..

Добавлено через 24 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
Это должно означать
я про это и говорил..
DrOffset
09.09.2014, 23:05
  #30

Не по теме:

Цитата Сообщение от KOPOJI Посмотреть сообщение
я про это и говорил..
Так я согласился. Просто развернул мысль.

_Ivana
2586 / 1595 / 141
Регистрация: 01.03.2013
Сообщений: 4,559
Записей в блоге: 2
09.09.2014, 23:07     Извлечь число из строки #31
Renji, а вы ассемблерные листинги скомпилированных ваших вариантов посмотрите и сравните с моим сишным примером на прошлой странице, и продолжим об элегантности. А строку с числом нигде сложить нельзя, ни "по человечески", ни математически. Везде имеются в виду перегруженные операторы конкатенации с предварительным переводом числа в строку в каком-то формате.
KOPOJI
Модератор
 Аватар для KOPOJI
16613 / 6554 / 408
Регистрация: 12.06.2012
Сообщений: 19,637
Завершенные тесты: 1
09.09.2014, 23:34     Извлечь число из строки #32
Помимо этого есть куча возможностей по добавлению такой возможности. Например, такой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <sstream>
 
template <typename L, typename R> std::string operator+(L left, R right)
{
    std::ostringstream os;
    os << left << right;
    return os.str();
}
 
int main(int argc, char *argv[])
{
    std::string s = "string";
    std::string s2 = s + 10;
    std::cout << s2 << std::endl;
    return 0;
}
http://ideone.com/n9QNky

Нагуглено на просторах инета за 1 минуту. Хотя написать самому его также не составляет труда.

Помимо этого, есть куча всяких функций по переводу чисел в строки, наподобие такого
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main(int argc, char *argv[])
{
    std::string s = "string";
    std::cout << s + std::to_string(10) << std::endl;
 
    return 0;
}
http://ideone.com/pApewK

Не по теме:

З.Ы. Перл уже свое отжил, имхо, с шестым затянули

DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
09.09.2014, 23:43     Извлечь число из строки #33
Цитата Сообщение от KOPOJI Посмотреть сообщение
Помимо этого есть куча возможностей по добавлению такой возможности. Например, такой
Он наверное имел в виду поддержку такого для строковых литералов.

Но беда в том, что строковый литерал - это массив, а массив участвует в адресной арифметике, т.к. преобразуется к указателю. Следовательно вот такая запись
C++
1
"abcdef" + 3;
будет интерпретирована как смещение указателя на три sizeof(char), а результатом выражения будет являться указатель на константный char. Поэтому на уровне языка обеспечить то, что он хочет, будет просто невозможно не перекроив его в совершенно другой язык.
Renji
1709 / 1142 / 270
Регистрация: 05.06.2014
Сообщений: 3,307
09.09.2014, 23:49     Извлечь число из строки #34
Она всегда будет существовать. Если сделать так, чтобы она не существовала - это будет уже совсем другой язык.
С чего бы? Инкремент/декремент/сравнение char оставить, неявное приведение к числу запретить. Желающим именно короткое число выдать тип byte. Дальше все как в C++.
Если вам не нравится статическая типизация - то так и скажите.
А, ну да, это просто динамическая типизация которая в C++ не нужна. Именно поэтому в C++ вообще не было стандартной функции преобразования числа в string. Если, конечно, не считать уже упомянутый выше stringstream. И только к C++11 наконец впилили to_string. Причем, ни то, ни другое не позволят вам сложить "N=" и N, так как "N="+N - адресная арифметика и точка. Как вы с шаблонами не шаманьте.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
09.09.2014, 23:54     Извлечь число из строки #35
Цитата Сообщение от Renji Посмотреть сообщение
С чего бы? Инкремент/декремент/сравнение char оставить, неявное приведение к числу запретить. Желающим именно короткое число выдать тип byte. Дальше все как в C++.
См. выше, я объяснил. Число тут не при чем.
Renji
1709 / 1142 / 270
Регистрация: 05.06.2014
Сообщений: 3,307
10.09.2014, 00:04     Извлечь число из строки #36
Поэтому на уровне языка обеспечить то, что он хочет, будет просто невозможно не перекроив его в совершенно другой язык.
Все возможно.
1) В C++11 ввели суффиксы делающие "string"s объектом string. Сделать этот суффикс опцией по умолчанию и радоваться. А для желающих по старинке пусть будет суффикс c_s.
2) Сделать "string" объектом c_string с возможностью явного приведения к const char*.
Но все это требует шаманств на уровне синтаксиса.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
10.09.2014, 00:10     Извлечь число из строки #37
Цитата Сообщение от Renji Посмотреть сообщение
Все возможно.
Во-первых разница есть: сделать своими силами с помощью языковых средств и иметь встроенную поддержку на уровне языка.
Во-вторых
Цитата Сообщение от Renji Посмотреть сообщение
Сделать этот суффикс опцией по умолчанию и радоваться.
и сколько это существующего кода поломает? Кстати, совершено не на пустом месте в std::string нет оператора приведения к const char*.
В третьих видно, что тема скатывается в холивар, поэтому с вашего позволения я больше здесь участвовать не буду. Если у кого-то есть конкретные здравые предложения, предлагаю опубликовать их здесь {ссылка удалена}. Пустые же разговоры в этой ветке ни к чему не приведут.
KOPOJI
Модератор
 Аватар для KOPOJI
16613 / 6554 / 408
Регистрация: 12.06.2012
Сообщений: 19,637
Завершенные тесты: 1
10.09.2014, 00:16     Извлечь число из строки #38
Цитата Сообщение от Renji Посмотреть сообщение
Желающим именно короткое число выдать тип byte
char уже не катит? Затайпдефьте себе на byte..
Цитата Сообщение от Renji Посмотреть сообщение
А, ну да, это просто динамическая типизация которая в C++ не нужна. Именно поэтому в C++ вообще не было стандартной функции преобразования числа в string
Если вам сильно хочется - конкатенируйте, как вам угодно через функции. Sprintf/snprintf к вашим услугам. Стандартные, еще с Си.
Цитата Сообщение от Renji Посмотреть сообщение
ни то, ни другое не позволят вам сложить
ААА, какой плохой язык!!! Там с плюсиком нельзя работать!!! ААА..

Добавлено через 3 минуты
Цитата Сообщение от Renji Посмотреть сообщение
явного приведения к const char*.
C++
1
const_cast<char *>(std::string.c_str())
?
Renji
1709 / 1142 / 270
Регистрация: 05.06.2014
Сообщений: 3,307
10.09.2014, 00:20     Извлечь число из строки #39
char уже не катит? Затайпдефьте себе на byte..
C++
1
2
3
byte X=10;
string text="text";
text+=X;
А теперь мучительно пытаемся понять что хотел получить автор - "text10" или "text\x0A"? Вот для исключения подобного и нужно развести char и byte по разным углам.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2014, 00:27     Извлечь число из строки
Еще ссылки по теме:

C++ Из строки извлечь символы операций в стек, а цифры - в другую строку
C++ В динамической матрице целых чисел добавить строки после строки, содержащей простое число
C++ Как извлечь числа из строки
C++ Извлечь значения из std::vector<char>, трактуя каждый символ, как разряд числа, сформировать это число
C++ Извлечь 3 бита целого числа A с позиции n и перенести в число B на позицию m

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

Или воспользуйтесь поиском по форуму:
KOPOJI
Модератор
 Аватар для KOPOJI
16613 / 6554 / 408
Регистрация: 12.06.2012
Сообщений: 19,637
Завершенные тесты: 1
10.09.2014, 00:27     Извлечь число из строки #40
Цитата Сообщение от Renji Посмотреть сообщение
А теперь мучительно пытаемся понять что хотел получить автор
Нет, представляем кривизну рук автора. Собственно, ваши сообщения похожи на известную пословицу про устав и монастырь. Я понимаю, вы привыкли к тому, что такое позволяется в вашем языке, который, конечно же, лучший. Но, представьте, в других ЯП это реализовано по другому, и не всегда то, что вы привыкли делать в одном ЯП хорошо во втором... Ой, а что творится в языках с префиксной или постфиксной формой записи
Yandex
Объявления
10.09.2014, 00:27     Извлечь число из строки
Ответ Создать тему
Опции темы

Текущее время: 14:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru