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

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

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

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

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

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

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

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

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

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

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

Выделение последнего слова из строки - 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]<<" ";
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:06  [ТС]     Выделение чисел из строки #3
К сожалению, не все так просто
Текст многострочный. Сначала нужно ввести количество строк, затем сам текст. К тому же, нужно вывести числа, стоящие отдельно. если я введу строку abcd12, то ничего не должно вывестись.
asics
Freelance
Эксперт C++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
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;
}
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:27  [ТС]     Выделение чисел из строки #5
Спасибо!
Осталось только разобраться, как все это делается, и перевести на Си
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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;
}
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:45  [ТС]     Выделение чисел из строки #7
>Для окончания ввода - CTRL+Z для винды
Когда жму в командной строке CTRL+Z, то получается, что я ввожу символ ^Z
А на си никто написать не может? Или хотя бы с комментариями.. просто си++ пока для меня темный лес..
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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;
}
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:58  [ТС]     Выделение чисел из строки #9
Да, пардон, все работает
но разобраться в этом будет проблематично..
и еще: разделителями считаются символы не только пробел, но и куча символов типа "#$%^ и т.п. В библиотеке есть функция isspace, которая выделяет разделители из строки
поэтому, при вводе, допустим: ;4.
вывод будет 4. это тоже надо учесть
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
18.04.2011, 00:04     Выделение чисел из строки #10
qvazar,
C++
1
const std::string& delims = ",.:?! ";
Никто не запрещает вроде добавить нужные разделители, ага?

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

Добавлено через 1 минуту
А без классов можно как-то сделать эту прогу?
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
18.04.2011, 00:28     Выделение чисел из строки #16
За разделители пробелы (что легко изменить)
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
 
typedef struct NODE {
    int value;
    struct NODE * next;
} node_t;
 
node_t * new_node(int val){
    node_t * n;
 
    if ( ( n = (node_t*)malloc(sizeof(node_t)) ) == NULL )
        return NULL;
 
    n->value = val;
    n->next = NULL;
 
    return n;
}
 
node_t * del_node(node_t * n){
    node_t * ret;
 
    if ( ! n )
        return NULL;
 
    ret = n->next;
    free(n);
 
    return ret;
}
 
void dump(const node_t * n){
    if ( n ){
        printf("%d\n", n->value);
        dump(n->next);
    }
}
 
int main(void){
    char buf[BUFSIZ], * p, * tail;
    node_t * first, * last, * cur;
    long val;
 
    first = NULL;
    last = NULL;
    printf("Enter some strings. Empty string - finish.\n");
 
    while ( printf("> ") && scanf("%[^\n]%*c", buf) == 1 ){
        for ( p = strtok(buf, " "); p; p = strtok(NULL, " ") ){
            errno = 0;
            val = strtol(p, &tail, 10);
            if ( errno || *tail )
                continue;
            if ( ( cur = new_node((int)val) ) == NULL ){
                fprintf(stderr, "Memory error!\n");
                exit(1);
            }
            if ( ! first )
                first = cur;
            else
                last->next = cur;
            last = cur;
        }
    }
 
    printf("Numbers:\n");
    dump(first);
 
    while ( first = del_node(first) )
        ;
 
    system("pause");
    exit(0);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2011, 00:51     Выделение чисел из строки
Еще ссылки по теме:

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

Указатели на строки. Выделение и освобождение памяти - C++
Всем добрый день. Есть два указателя на char. Для первого выделяется память а у второго просто делаем копию с первого. Для 1-го...

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

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

Динамическое выделение памяти под строки - C++
Доброго времени суток. Изучаю основы C++, дошел до раздела &quot;указатели и динамическое выделение памяти&quot;. Имеется код, в котором...


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

Или воспользуйтесь поиском по форуму:
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
18.04.2011, 00:51  [ТС]     Выделение чисел из строки #17
Спасибо
Попытаюсь разобраться. Структуры для меня пока тоже скрытая область
Yandex
Объявления
18.04.2011, 00:51     Выделение чисел из строки
Ответ Создать тему
Опции темы

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