Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/193: Рейтинг темы: голосов - 193, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37

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

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

Студворк — интернет-сервис помощи студентам
Нужно выделить из текста(в несколько строк) числа, которые при этом не являются частями слов(т.е. числа, окруженные разделителями). Пишу на Си.
Собственно, моя идея такова: запустить цикл, начать проверку символов, являются ли они числами(с помощью функции isdigit). если да, то проверить предыдущий и последующие символы(если буква - то гуд бай, если число окружено разделителями - то занести его в массив).
Идея есть, а вот реализация подхрамывает(лучшее мое достижение - я сумел выделить из текста все числа). Буду благодарен за любые советы.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.04.2011, 22:28
Ответы с готовыми решениями:

Выделение чисел из строки
В общем написал программу для обычного выделения чисел строки: #include<iostream> #include<cstring> #include<cstdlib> ...

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

Выделение чисел из строки
Здравствуйте. Как выделить отдельные целые числа из введенной пользователем строки? Числом считается последовательность цифр,...

16
3 / 3 / 0
Регистрация: 26.03.2011
Сообщений: 9
17.04.2011, 22:49
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]<<" ";
2
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:06  [ТС]
К сожалению, не все так просто
Текст многострочный. Сначала нужно ввести количество строк, затем сам текст. К тому же, нужно вывести числа, стоящие отдельно. если я введу строку abcd12, то ничего не должно вывестись.
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
17.04.2011, 23:24
Цитата Сообщение от 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
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:27  [ТС]
Спасибо!
Осталось только разобраться, как все это делается, и перевести на Си
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.04.2011, 23:34
Для окончания ввода - 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
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:45  [ТС]
>Для окончания ввода - CTRL+Z для винды
Когда жму в командной строке CTRL+Z, то получается, что я ввожу символ ^Z
А на си никто написать не может? Или хотя бы с комментариями.. просто си++ пока для меня темный лес..
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.04.2011, 23:52
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
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
17.04.2011, 23:58  [ТС]
Да, пардон, все работает
но разобраться в этом будет проблематично..
и еще: разделителями считаются символы не только пробел, но и куча символов типа "#$%^ и т.п. В библиотеке есть функция isspace, которая выделяет разделители из строки
поэтому, при вводе, допустим: ;4.
вывод будет 4. это тоже надо учесть
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.04.2011, 00:04
qvazar,
C++
1
const std::string& delims = ",.:?! ";
Никто не запрещает вроде добавить нужные разделители, ага?

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

Добавлено через 1 минуту
А без классов можно как-то сделать эту прогу?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
18.04.2011, 00:28
За разделители пробелы (что легко изменить)
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);
}
1
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 37
18.04.2011, 00:51  [ТС]
Спасибо
Попытаюсь разобраться. Структуры для меня пока тоже скрытая область
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.04.2011, 00:51
Помогаю со студенческими работами здесь

Выделение чисел из строки
Помогите, пожалуйста, в одном вопросе. У меня есть файл, где в несколько строк, через &quot;;&quot;, записаны числа. Мне нужно эти числа...

Выделение чисел из строки
Дана строка. Выделить из нее набор интов, что бы те отвечали следующему правилу: каждое последующее больше предыдущего на 1. К примеру,...

Выделение чисел из строки
Доброе утро. Подскажите пожалуйста есть вот такая переменная типа String &quot;1.54.23.76.35.9&quot;, необходимо получить массив чисел,...

Выделение чисел из строки. Сортировка.
На вход программе подается строка символов ,оканчивающаяся точкой ,и состоящая из нулевого кол-ва неотрицательных целых чисел ,записанных в...

Выделение чисел из строки через atoi()
Есть вот такая строка &quot;FUNCTION(y=7+9*x)&quot;, задаю её я через argv и мне надо выделить из неё числа и записать их в переменные. Помогите,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru