Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
Завершенные тесты: 1
1

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

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

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

Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2014, 17:08
Ответы с готовыми решениями:

Извлечь из строки числа
Нужно извлечь из строки числа. "12/12/12" результат! day = 12; mounth =...

Как извлечь числа из строки
Предположим что есть такое выражение и оно записано в блокноте (100;200) , Как...

Как из числа double 4.056 извлечь число 1000?
То есть число это читается так: 4 целых 56 тысячных, вот мне нужно тысячу...

Как извлечь только цифры из строки
Есть файл и в нем строки вида 00:00:00,000 --> 00:00:00,200 Нужно извлечь...

Извлечь числа из строки в одну переменную
Допустим, дана строка ( string ), в которую пользователь ввел 3+5=. В данном...

42
dr.curse
393 / 349 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
08.09.2014, 23:06 21
Цитата Сообщение от [progeR] Посмотреть сообщение
что это ДОЛЖНО быть неотъемлемой часть языка тем более общего назначения)
и почему же это? этот функционал легко добавляется с помощью библиотек, и это помоему лучше чем все пихать в стандарт
0
Renji
2124 / 1562 / 476
Регистрация: 05.06.2014
Сообщений: 4,527
08.09.2014, 23:43 22
и почему же это? этот функционал легко добавляется с помощью библиотек, и это помоему лучше чем все пихать в стандарт
С помощью библиотек добавляется костыль. Как это выглядит в Перле (да, без подключения каких либо библиотек):
Perl
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
1
2
3
4
$text="1234 5678 9012";
while($text=~/\d+/g){
    print "$&\n";
}
И попробуйте это сделать также элегантно в C++.
1
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
Завершенные тесты: 1
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++ от этого недуга?
0
marina2
Рожденная для битвы
272 / 50 / 10
Регистрация: 08.11.2009
Сообщений: 1,030
09.09.2014, 20:42 24
возможно с помощью функции форматированиz setw()
http://msdn.microsoft.com/ru-ru/library/8bbhbaew.aspx
0
DrOffset
9014 / 4861 / 1196
Регистрация: 30.01.2014
Сообщений: 7,942
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;
}
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16755 / 6646 / 865
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 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}
Это что, означает, что плюсы УГ, а руби/питон форевер?
1
Renji
2124 / 1562 / 476
Регистрация: 05.06.2014
Сообщений: 4,527
09.09.2014, 22:42 27
Это что, означает, что плюсы УГ, а руби/питон форевер?
Это означает что нормальные регулярные выражения должны поддерживаться на уровне синтаксиса, а не на уровне библиотек. Строки, кстати, тоже. А то ведь даже строку с числом по человечески ("N="+N) сложить нельзя. И вряд ли будет можно пока существует неоднозначность "это число или символ?".
0
DrOffset
9014 / 4861 / 1196
Регистрация: 30.01.2014
Сообщений: 7,942
09.09.2014, 23:00 28
Цитата Сообщение от KOPOJI Посмотреть сообщение
Это что, означает, что плюсы УГ, а руби/питон форевер?
Это должно означать, что каждому инструменту свое место. И если задача требует использовать perl, значит надо использовать perl, а не фрустрировать на тему того как в С++ все многословно.

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

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

Не по теме:

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

0
_Ivana
3236 / 1866 / 235
Регистрация: 01.03.2013
Сообщений: 5,111
Записей в блоге: 5
09.09.2014, 23:07 31
Renji, а вы ассемблерные листинги скомпилированных ваших вариантов посмотрите и сравните с моим сишным примером на прошлой странице, и продолжим об элегантности. А строку с числом нигде сложить нельзя, ни "по человечески", ни математически. Везде имеются в виду перегруженные операторы конкатенации с предварительным переводом числа в строку в каком-то формате.
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16755 / 6646 / 865
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 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

Не по теме:

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

0
DrOffset
9014 / 4861 / 1196
Регистрация: 30.01.2014
Сообщений: 7,942
09.09.2014, 23:43 33
Цитата Сообщение от KOPOJI Посмотреть сообщение
Помимо этого есть куча возможностей по добавлению такой возможности. Например, такой
Он наверное имел в виду поддержку такого для строковых литералов.

Но беда в том, что строковый литерал - это массив, а массив участвует в адресной арифметике, т.к. преобразуется к указателю. Следовательно вот такая запись
C++
1
"abcdef" + 3;
будет интерпретирована как смещение указателя на три sizeof(char), а результатом выражения будет являться указатель на константный char. Поэтому на уровне языка обеспечить то, что он хочет, будет просто невозможно не перекроив его в совершенно другой язык.
0
Renji
2124 / 1562 / 476
Регистрация: 05.06.2014
Сообщений: 4,527
09.09.2014, 23:49 34
Она всегда будет существовать. Если сделать так, чтобы она не существовала - это будет уже совсем другой язык.
С чего бы? Инкремент/декремент/сравнение char оставить, неявное приведение к числу запретить. Желающим именно короткое число выдать тип byte. Дальше все как в C++.
Если вам не нравится статическая типизация - то так и скажите.
А, ну да, это просто динамическая типизация которая в C++ не нужна. Именно поэтому в C++ вообще не было стандартной функции преобразования числа в string. Если, конечно, не считать уже упомянутый выше stringstream. И только к C++11 наконец впилили to_string. Причем, ни то, ни другое не позволят вам сложить "N=" и N, так как "N="+N - адресная арифметика и точка. Как вы с шаблонами не шаманьте.
0
DrOffset
9014 / 4861 / 1196
Регистрация: 30.01.2014
Сообщений: 7,942
09.09.2014, 23:54 35
Цитата Сообщение от Renji Посмотреть сообщение
С чего бы? Инкремент/декремент/сравнение char оставить, неявное приведение к числу запретить. Желающим именно короткое число выдать тип byte. Дальше все как в C++.
См. выше, я объяснил. Число тут не при чем.
0
Renji
2124 / 1562 / 476
Регистрация: 05.06.2014
Сообщений: 4,527
10.09.2014, 00:04 36
Поэтому на уровне языка обеспечить то, что он хочет, будет просто невозможно не перекроив его в совершенно другой язык.
Все возможно.
1) В C++11 ввели суффиксы делающие "string"s объектом string. Сделать этот суффикс опцией по умолчанию и радоваться. А для желающих по старинке пусть будет суффикс c_s.
2) Сделать "string" объектом c_string с возможностью явного приведения к const char*.
Но все это требует шаманств на уровне синтаксиса.
0
DrOffset
9014 / 4861 / 1196
Регистрация: 30.01.2014
Сообщений: 7,942
10.09.2014, 00:10 37
Цитата Сообщение от Renji Посмотреть сообщение
Все возможно.
Во-первых разница есть: сделать своими силами с помощью языковых средств и иметь встроенную поддержку на уровне языка.
Во-вторых
Цитата Сообщение от Renji Посмотреть сообщение
Сделать этот суффикс опцией по умолчанию и радоваться.
и сколько это существующего кода поломает? Кстати, совершено не на пустом месте в std::string нет оператора приведения к const char*.
В третьих видно, что тема скатывается в холивар, поэтому с вашего позволения я больше здесь участвовать не буду. Если у кого-то есть конкретные здравые предложения, предлагаю опубликовать их здесь {ссылка удалена}. Пустые же разговоры в этой ветке ни к чему не приведут.
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16755 / 6646 / 865
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 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())
?
0
Renji
2124 / 1562 / 476
Регистрация: 05.06.2014
Сообщений: 4,527
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 по разным углам.
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16755 / 6646 / 865
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 1
10.09.2014, 00:27 40
Цитата Сообщение от Renji Посмотреть сообщение
А теперь мучительно пытаемся понять что хотел получить автор
Нет, представляем кривизну рук автора. Собственно, ваши сообщения похожи на известную пословицу про устав и монастырь. Я понимаю, вы привыкли к тому, что такое позволяется в вашем языке, который, конечно же, лучший. Но, представьте, в других ЯП это реализовано по другому, и не всегда то, что вы привыкли делать в одном ЯП хорошо во втором... Ой, а что творится в языках с префиксной или постфиксной формой записи
0
10.09.2014, 00:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2014, 00:27

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

Извлечь 3 бита целого числа A с позиции n и перенести в число B на позицию m
Доброго времени суток.Дана вот такая задача : извлечь 3 бита числа А, начиная с...

Как правильно извлечь целое число из char (atoi возвращает -858993460)?
вот где d=atoi(Digit); Digit='2''0''1''7' , а d почему-то получается ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru