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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.85
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
#1

Выделение чисел из строки - C++

17.04.2011, 22:28. Просмотров 6199. Ответов 16
Метки нет (Все метки)

Нужно выделить из текста(в несколько строк) числа, которые при этом не являются частями слов(т.е. числа, окруженные разделителями). Пишу на Си.
Собственно, моя идея такова: запустить цикл, начать проверку символов, являются ли они числами(с помощью функции isdigit). если да, то проверить предыдущий и последующие символы(если буква - то гуд бай, если число окружено разделителями - то занести его в массив).
Идея есть, а вот реализация подхрамывает(лучшее мое достижение - я сумел выделить из текста все числа). Буду благодарен за любые советы.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2011, 22:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение чисел из строки (C++):

Выделение чисел из строки - C++
как задать строку с числами ? не с одним числом а пару чисел чтобы потом работать с ними хелп плз

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

Выделение из строки подстроки. - C++
Добрый вечер! Задачка такая.. Мы вводим строку( например "фцу2ф555ац2.32ц"), а оно нам должно выдать число(можно строку), только такого...

Выделение подстроки из строки - C++
Всем доброго времени суток! Есть строка: "215 20110225221015" здесь закодирована дата следующего вида: 2011-02-25 22:10:15 какую...

Выделение последнего слова из строки - C++
Написать программу выделения последнего слова из введенной строки и отображение его на экране. Языковая среда Borland C++ 3.1, но не...

Выделение слова из строки в списке - C++
Как из строки находязейся в контейнере STL list выделить слово? условие задачки: /*Примечание. Во всех вариантах этого задания...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
TomyThompson
2 / 2 / 0
Регистрация: 26.03.2011
Сообщений: 9
17.04.2011, 22:49 #2
C++
1
2
3
4
5
6
7
8
9
char*str=new char;
int n;
/ / ввод текста
cout<<"Vvedit` txt \n\n";
gets (str);
n=strlen (str); // n= длина текста
for(int i=0; i<n; i++)
if(str[i]>='0'&&str[i]<='9') // если цифру найдено - то выводим ее
cout<<str[i]<<" ";
1
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:06  [ТС] #3
К сожалению, не все так просто
Текст многострочный. Сначала нужно ввести количество строк, затем сам текст. К тому же, нужно вывести числа, стоящие отдельно. если я введу строку abcd12, то ничего не должно вывестись.
0
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
17.04.2011, 23:24 #4
Цитата Сообщение от qvazar Посмотреть сообщение
выделить из текста(в несколько строк) числа, которые при этом не являются частями слов(т.е. числа, окруженные разделителями).
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
31
32
33
34
35
36
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <cctype>
#include <algorithm>
 
bool chek(const std::string &s){
  return s.length() == std::count_if(s.begin(), s.end(), isdigit);
}
 
int str_to_num(const std::string &n){
  std::istringstream ist(n);
  int num;
  ist >> num;
  return num;
}
 
int main(){
  size_t cnt_str = 0;
  std::cout << "\n\nCount string = ";
  std::cin >> cnt_str;
  std::vector<int> nums;
  while(cnt_str--){
    std::string buf;
    std::cin.sync();
    getline(std::cin, buf);
    std::istringstream ist(buf);
    while(ist >> buf)
      if(chek(buf))
        nums.push_back(str_to_num(buf));
  }
  for(size_t i = 0; i < nums.size(); ++i)
    std::cout << nums[i] << ' ';
  return 0;
}
1
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:27  [ТС] #5
Спасибо!
Осталось только разобраться, как все это делается, и перевести на Си
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
17.04.2011, 23:34 #6
Для окончания ввода - CTRL+Z для винды, CTRL+D для Linux

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
31
32
#include <string>
#include <iostream>
#include <vector>
#include <sstream>
 
bool isNumber(const std::string& str)
{
    std::istringstream ist(str);
    int number = 0;
    return (ist >> number) && (ist>>std::ws).eof();
}
 
int main()
{
    std::vector<std::string> vec;
    std::string str;
    while(std::getline(std::cin, str))
        vec.push_back(str);
    const std::string& delims = ",.:?! ";
    for(std::vector<std::string>::iterator iter = vec.begin();
        iter != vec.end(); ++iter)
    {
        for(std::string::iterator t_iter = iter->begin(); t_iter != iter->end(); ++t_iter)
            if(delims.find(*t_iter) != std::string::npos)
                *t_iter = ' ';
        std::istringstream ist(*iter);
        while(ist >> str)
            if(isNumber(str))
                std::cout<<str<<'\n';
    }
    return 0;
}
1
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:45  [ТС] #7
>Для окончания ввода - CTRL+Z для винды
Когда жму в командной строке CTRL+Z, то получается, что я ввожу символ ^Z
А на си никто написать не может? Или хотя бы с комментариями.. просто си++ пока для меня темный лес..
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
17.04.2011, 23:52 #8
qvazar, Ну да. Вводите. А потом enter жмете и все ок)

Добавлено через 5 минут
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//Хедер для работы со строками
#include <string>
//In/Out
#include <iostream>
//Хедер класса vector
#include <vector>
//Хедер для строковых потоков
#include <sstream>
 
//Функция которая возвращает true если переданная ей строка - число
bool isNumber(const std::string& str)
{
        //Строковый поток инициализируется строкой
        std::istringstream ist(str);
        int number = 0;
        //Если вывод из потока в число прошло успешно и в потоке нет символов кроме пробелов - возвращаем true.
        return (ist >> number) && (ist>>std::ws).eof();
}
 
int main()
{
        //Вектор строк
        std::vector<std::string> vec;
        std::string str;
        //Вводим до CTRL+Z
        while(std::getline(std::cin, str))
                //Вставляем в конец вектора
                vec.push_back(str);
        //Строка разделителей
        const std::string& delims = ",.:?! ";
        //Пробегаем по вектору используя итераторы
        for(std::vector<std::string>::iterator iter = vec.begin();
                iter != vec.end(); ++iter)
        {
                //Пробегаем по каждому символу строки на которую указывает итератор
                for(std::string::iterator t_iter = iter->begin(); t_iter != iter->end(); ++t_iter)
                        //Если в разделителях найден текущий символ - меняем его на пробел
                        if(delims.find(*t_iter) != std::string::npos)
                                *t_iter = ' ';
                //Строковый поток инициализируется строка
                std::istringstream ist(*iter);
                //До тех пор пока поток не пуст - выводим слово в строку
                while(ist >> str)
                        //Если слово - число, печатаем его
                        if(isNumber(str))
                                std::cout<<str<<'\n';
        }
        return 0;
}
1
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:58  [ТС] #9
Да, пардон, все работает
но разобраться в этом будет проблематично..
и еще: разделителями считаются символы не только пробел, но и куча символов типа "#$%^ и т.п. В библиотеке есть функция isspace, которая выделяет разделители из строки
поэтому, при вводе, допустим: ;4.
вывод будет 4. это тоже надо учесть
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
18.04.2011, 00:04 #10
qvazar,
C++
1
const std::string& delims = ",.:?! ";
Никто не запрещает вроде добавить нужные разделители, ага?

Ну и насчет isspace isspace
1
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
18.04.2011, 00:08  [ТС] #11
Ага, спасибо, понял.
Просто Си++ не знаю, поэтому не обратил на эту строчку кода внимание.
На Си можно как-то это записать?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
18.04.2011, 00:09 #12
qvazar,
C
1
const char* delims = ",.:!?# ";
Ну и все символы какие нужно сразу дописывайте в эту строку просто и все.
0
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
18.04.2011, 00:16  [ТС] #13
Цитата Сообщение от ForEveR Посмотреть сообщение
qvazar,
C
1
const char* delims = ",.:!?# ";
Ну и все символы какие нужно сразу дописывайте в эту строку просто и все.
Да, я это сразу понял.
Можешь на Си написать, пожалуйста? Или просто объяснить, что вообще происходит в коде?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
18.04.2011, 00:20 #14
qvazar, Я же все прокомментировал оО
0
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
18.04.2011, 00:27  [ТС] #15
Точно, не заметил

Добавлено через 1 минуту
А без классов можно как-то сделать эту прогу?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2011, 00:27
Привет! Вот еще темы с ответами:

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

Выделение памяти для строки - C++
Почему размер строки первой 4 байта а второй 50 байт?Первая должна сколько же. #include &lt;stdio.h&gt; #include &lt;Windows.h&gt; #include...

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

Динамическое выделение памяти для строки - C++
Подскажите, пожалуйста , почему в данной программе появляются ошибки в строке return Vector(v1.x + v2.x, v1.y + v2.y, v1.cp +...


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

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

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