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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
06.09.2014, 17:08     Извлечь число из строки #1
Добрый день.
Есть строка, например, вида:
Код
field001600.bin
Из нее нужно извлечь число 1600 (т.е. без ведущих нулей). Подскажите, как это делается на C++?
На PHP это делается за 0.5 сек, например, с помощью регулярных выражений.

Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
08.09.2014, 23:06     Извлечь число из строки #21
Цитата Сообщение от [progeR] Посмотреть сообщение
что это ДОЛЖНО быть неотъемлемой часть языка тем более общего назначения)
и почему же это? этот функционал легко добавляется с помощью библиотек, и это помоему лучше чем все пихать в стандарт
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
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]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
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
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
09.09.2014, 20:42     Извлечь число из строки #24
возможно с помощью функции форматированиz setw()
http://msdn.microsoft.com/ru-ru/library/8bbhbaew.aspx
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
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
16242 / 6453 / 390
Регистрация: 12.06.2012
Сообщений: 19,352
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
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
09.09.2014, 22:42     Извлечь число из строки #27
Это что, означает, что плюсы УГ, а руби/питон форевер?
Это означает что нормальные регулярные выражения должны поддерживаться на уровне синтаксиса, а не на уровне библиотек. Строки, кстати, тоже. А то ведь даже строку с числом по человечески ("N="+N) сложить нельзя. И вряд ли будет можно пока существует неоднозначность "это число или символ?".
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
09.09.2014, 23:00     Извлечь число из строки #28
Цитата Сообщение от KOPOJI Посмотреть сообщение
Это что, означает, что плюсы УГ, а руби/питон форевер?
Это должно означать, что каждому инструменту свое место. И если задача требует использовать perl, значит надо использовать perl, а не фрустрировать на тему того как в С++ все многословно.

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

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

Не по теме:

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

_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,147
Записей в блоге: 2
09.09.2014, 23:07     Извлечь число из строки #31
Renji, а вы ассемблерные листинги скомпилированных ваших вариантов посмотрите и сравните с моим сишным примером на прошлой странице, и продолжим об элегантности. А строку с числом нигде сложить нельзя, ни "по человечески", ни математически. Везде имеются в виду перегруженные операторы конкатенации с предварительным переводом числа в строку в каком-то формате.
KOPOJI
Модератор
 Аватар для KOPOJI
16242 / 6453 / 390
Регистрация: 12.06.2012
Сообщений: 19,352
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
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
09.09.2014, 23:43     Извлечь число из строки #33
Цитата Сообщение от KOPOJI Посмотреть сообщение
Помимо этого есть куча возможностей по добавлению такой возможности. Например, такой
Он наверное имел в виду поддержку такого для строковых литералов.

Но беда в том, что строковый литерал - это массив, а массив участвует в адресной арифметике, т.к. преобразуется к указателю. Следовательно вот такая запись
C++
1
"abcdef" + 3;
будет интерпретирована как смещение указателя на три sizeof(char), а результатом выражения будет являться указатель на константный char. Поэтому на уровне языка обеспечить то, что он хочет, будет просто невозможно не перекроив его в совершенно другой язык.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
09.09.2014, 23:49     Извлечь число из строки #34
Она всегда будет существовать. Если сделать так, чтобы она не существовала - это будет уже совсем другой язык.
С чего бы? Инкремент/декремент/сравнение char оставить, неявное приведение к числу запретить. Желающим именно короткое число выдать тип byte. Дальше все как в C++.
Если вам не нравится статическая типизация - то так и скажите.
А, ну да, это просто динамическая типизация которая в C++ не нужна. Именно поэтому в C++ вообще не было стандартной функции преобразования числа в string. Если, конечно, не считать уже упомянутый выше stringstream. И только к C++11 наконец впилили to_string. Причем, ни то, ни другое не позволят вам сложить "N=" и N, так как "N="+N - адресная арифметика и точка. Как вы с шаблонами не шаманьте.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
09.09.2014, 23:54     Извлечь число из строки #35
Цитата Сообщение от Renji Посмотреть сообщение
С чего бы? Инкремент/декремент/сравнение char оставить, неявное приведение к числу запретить. Желающим именно короткое число выдать тип byte. Дальше все как в C++.
См. выше, я объяснил. Число тут не при чем.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
10.09.2014, 00:04     Извлечь число из строки #36
Поэтому на уровне языка обеспечить то, что он хочет, будет просто невозможно не перекроив его в совершенно другой язык.
Все возможно.
1) В C++11 ввели суффиксы делающие "string"s объектом string. Сделать этот суффикс опцией по умолчанию и радоваться. А для желающих по старинке пусть будет суффикс c_s.
2) Сделать "string" объектом c_string с возможностью явного приведения к const char*.
Но все это требует шаманств на уровне синтаксиса.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
10.09.2014, 00:10     Извлечь число из строки #37
Цитата Сообщение от Renji Посмотреть сообщение
Все возможно.
Во-первых разница есть: сделать своими силами с помощью языковых средств и иметь встроенную поддержку на уровне языка.
Во-вторых
Цитата Сообщение от Renji Посмотреть сообщение
Сделать этот суффикс опцией по умолчанию и радоваться.
и сколько это существующего кода поломает? Кстати, совершено не на пустом месте в std::string нет оператора приведения к const char*.
В третьих видно, что тема скатывается в холивар, поэтому с вашего позволения я больше здесь участвовать не буду. Если у кого-то есть конкретные здравые предложения, предлагаю опубликовать их здесь {ссылка удалена}. Пустые же разговоры в этой ветке ни к чему не приведут.
KOPOJI
Модератор
 Аватар для KOPOJI
16242 / 6453 / 390
Регистрация: 12.06.2012
Сообщений: 19,352
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
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
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++ Как извлечь числа из строки

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

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

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