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

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

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

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

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

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

Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2014, 17:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Извлечь число из строки (C++):

Извлечь из строки числа - C++
Нужно извлечь из строки числа. "12/12/12" результат! day = 12; mounth = 12; year = 12; убил 10 минут чтобы найти что-то...

Как извлечь числа из строки - C++
Предположим что есть такое выражение и оно записано в блокноте (100;200) , Как извлечь из текстового документа 2 числа 100 и 200? понимаю...

Как из числа double 4.056 извлечь число 1000? - C++
То есть число это читается так: 4 целых 56 тысячных, вот мне нужно тысячу извлечь программно. Функции, предлагаемые math.h извлекают либо...

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

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

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

42
DrOffset
7310 / 4409 / 998
Регистрация: 30.01.2014
Сообщений: 7,245
06.09.2014, 23:00 #16
Цитата Сообщение от [progeR] Посмотреть сообщение
Шо за язык такой, в котором нет даже элементарного функционала для работы со строками...
Элементарный есть. А регулярок и т.п. очень долго в стандарте не было, в том числе потому, что философия языка предполагает реализацию всех необходимых плюшек в библиотеках, и только самый минимум в ядре языка. Естественно, PHP заточен на обработку текста, и там сделано все, чтобы эту обработку максимально упростить. Если хочешь обрабатывать строки так же просто и в С++, придется найти (поставить) и использовать соответствующую библиотеку (тот же boost), или готовиться к ручной реализации всех удобств.
0
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
06.09.2014, 23:08 #17
Элементарный есть. А регулярок и т.п. очень долго в стандарте не было, в том числе потому, что философия языка предполагает реализацию всех необходимых плюшек в библиотеках, и только самый минимум в ядре языка.
В стандарт входит и набор библиотек.
0
DrOffset
06.09.2014, 23:20
  #18

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
В стандарт входит и набор библиотек.
Это к чему щас было?

0
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
06.09.2014, 23:24 #19
Это к чему щас было?
К тому что "самый минимум в ядре языка" не имеет никакого отношения к регулярным выражениям реализованным в библиотеках C++11.
0
DrOffset
7310 / 4409 / 998
Регистрация: 30.01.2014
Сообщений: 7,245
06.09.2014, 23:52 #20
Цитата Сообщение от Renji Посмотреть сообщение
К тому что "самый минимум в ядре языка" не имеет никакого отношения к регулярным выражениям реализованным в библиотеках C++11.
Может конечно я криво выразился, но ты меня не так понял.

Добавлено через 15 минут
Renji, я схлопнул две мысли в одну, поэтому получилось так. Вот они:
1) Я имел в виду, что стандарт не стремятся добавлять абсолютно все возможности. Поэтому долгое время там не было многих вещей, и до сих пор нет еще многих. STL Степанова в свое время положила этому начало, т.к. следовала той же философии: минимум специализации, максимум обобщения.
2) Помимо этого, в отличие от PHP в С++ многие вещи выносятся в библиотеки (неважно стандартные или нет), а в самом ядре находится только минимум возможностей.

PS. На самом деле я очень ценю, что на этом форуме есть такие въедливые люди, которые могут навести на подобные вещи.
0
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
08.09.2014, 23:06 #21
Цитата Сообщение от [progeR] Посмотреть сообщение
что это ДОЛЖНО быть неотъемлемой часть языка тем более общего назначения)
и почему же это? этот функционал легко добавляется с помощью библиотек, и это помоему лучше чем все пихать в стандарт
0
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
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++.
1
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 605
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 / 5
Регистрация: 08.11.2009
Сообщений: 1,022
09.09.2014, 20:42 #24
возможно с помощью функции форматированиz setw()
http://msdn.microsoft.com/ru-ru/library/8bbhbaew.aspx
0
DrOffset
7310 / 4409 / 998
Регистрация: 30.01.2014
Сообщений: 7,245
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
16701 / 6623 / 433
Регистрация: 12.06.2012
Сообщений: 19,879
Завершенные тесты: 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
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
09.09.2014, 22:42 #27
Это что, означает, что плюсы УГ, а руби/питон форевер?
Это означает что нормальные регулярные выражения должны поддерживаться на уровне синтаксиса, а не на уровне библиотек. Строки, кстати, тоже. А то ведь даже строку с числом по человечески ("N="+N) сложить нельзя. И вряд ли будет можно пока существует неоднозначность "это число или символ?".
0
DrOffset
7310 / 4409 / 998
Регистрация: 30.01.2014
Сообщений: 7,245
09.09.2014, 23:00 #28
Цитата Сообщение от KOPOJI Посмотреть сообщение
Это что, означает, что плюсы УГ, а руби/питон форевер?
Это должно означать, что каждому инструменту свое место. И если задача требует использовать perl, значит надо использовать perl, а не фрустрировать на тему того как в С++ все многословно.

Цитата Сообщение от Renji Посмотреть сообщение
И вряд ли будет можно пока существует неоднозначность "это число или символ?".
Она всегда будет существовать. Если сделать так, чтобы она не существовала - это будет уже совсем другой язык. Лучше просто перестать тянуть С++ за уши в ту область (массивная обработка текстов), где существуют инструменты специально для этого предназначенные.
0
KOPOJI
Модератор
Эксперт HTML/CSSЭксперт PHP
16701 / 6623 / 433
Регистрация: 12.06.2012
Сообщений: 19,879
Завершенные тесты: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2014, 23:05
Привет! Вот еще темы с ответами:

Из положительных элементов извлечь квадратный корень, отрицательные возвести в квадрат, нулевые заменить на число В - C++
Задан массив, состоящий из 10 элементов. Из положительных элементов извлечь квадратный корень, отрицательные возвести в квадрат, нулевые...

Из строки извлечь символы операций в стек, а цифры - в другую строку - C++
Из исходной строки необходимо извлечь символы операций и поместить в стек а цифры в другую строку... но вот ошибка... Вот код:const int max...

Парсинг адресной строки, хочу извлечь индекс и название города - C++
Всем доброго дня. Хочу распарсить такой вот файлик: ------------------------------------------------------------ 125414,...

Извлечь значения из std::vector<char>, трактуя каждый символ, как разряд числа, сформировать это число - C++
Доброго времени суток. Есть вектор char std::vector &lt; char &gt; VECT; Его содержимое, например VECT == 43 '+' VECT ==...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.09.2014, 23:05
Ответ Создать тему
Опции темы

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