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

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

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

C++ Выделение из строки подстроки.
C++ Строки и символы, выделение памяти
выделение подстроки из строки C++
C++ выделение подстроки из строки
C++ Выделение слова из строки в списке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
2838 / 1775 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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++ Выделение чисел из строки

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

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

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