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

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

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

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

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

Нужно выделить из текста(в несколько строк) числа, которые при этом не являются частями слов(т.е. числа, окруженные разделителями). Пишу на Си.
Собственно, моя идея такова: запустить цикл, начать проверку символов, являются ли они числами(с помощью функции isdigit). если да, то проверить предыдущий и последующие символы(если буква - то гуд бай, если число окружено разделителями - то занести его в массив).
Идея есть, а вот реализация подхрамывает(лучшее мое достижение - я сумел выделить из текста все числа). Буду благодарен за любые советы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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++
 Аватар для asics
2842 / 1779 / 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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
18.04.2011, 00:20     Выделение чисел из строки #14
qvazar, Я же все прокомментировал оО
qvazar
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
18.04.2011, 00:27  [ТС]     Выделение чисел из строки #15
Точно, не заметил

Добавлено через 1 минуту
А без классов можно как-то сделать эту прогу?
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
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++ Выделение последнего слова из строки
C++ выделение из массива четных и нечетных чисел
C++ Выделение чисел из строки
C++ Выделение памяти для строки
Динамическое выделение памяти для строки C++

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

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

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