Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
9 / 9 / 2
Регистрация: 14.07.2010
Сообщений: 166
1

Парсер массива

22.12.2010, 18:03. Показов 3441. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Поскажите пожалуйста, парсер массива чисел на входе: строка вида "число|число|число|число" и кол-во чисел. число - целое, на выходе: массив из чисел
функцию strtok и аналоги не использовать, а atoi можно.

Первый раз пишу парсер, куча ошибок и не доработок, помогите плз

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
void main ()
{
const char * a[10];
int i;
cout<< "Enter characteries: ";
for( i=0; i<10; i++)
{
    cin >> a[i];
cout<<  atoi(a[i])<<" ";
}
system ("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2010, 18:03
Ответы с готовыми решениями:

Парсер массива
Поскажите пожалуйста, парсер массива чисел на входе: строка вида &quot;число|число|число|число&quot; и кол-во...

Парсер JSON массива
Люди добрые, помогите пожалуйста. Имеется json-ответ от сервера вида: классы и переменные...

Парсер
Здравствуйте! Хочу сделать для себя программу-парсер раздач на трекер. Двумя полями и одной...

С# парсер
Не подскажете почему если просматривать исходный код сайт с помощью Chrome или Opera показывает...

19
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 19:01 2
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
#include <stdio.h>
#include <stdlib.h>
 
#define BUFFSIZE 80
#define MAXNUMCNT 20
 
int* getNumbers(char*, int*, size_t, size_t*);
 
int main()
{
    char buf[BUFFSIZE + 1];
    int  nums[MAXNUMCNT];
    size_t cnt;
    puts("Введите строку чисел");
    fgets(buf, BUFFSIZE, stdin);
    getNumbers(buf, nums, MAXNUMCNT, &cnt);
    for(size_t i = 0; i < cnt; ++i)
        printf("nums[%02u] = %d\n", i + 1, nums[i]); 
    return 0;
}
 
/* Функция будет разбирать строку str и разбивать ее на числа
 * которые будут храниться в массиве numbers, но не больше, чем
 * size чисел. Если указатель cnt не указывает на NULL, то в нем
 * возвращается количество распарсенных чисел
 * Строка разрушается
 */ 
int* getNumbers(char* str, int* numbers, size_t size, size_t* cnt)
{
    size_t n = 0;
    char *p = str;
    char *q = str;
    
    while(*q && (n <= size))
    {
        if(*q == '|')
        {
            *q++ = '\0';
            numbers[n++] = atoi(p);
            p = q;
        }
        else
            ++q;
    }
    
    if(n < size)
        numbers[n++] = atoi(p);
    
    if(cnt)
        *cnt = n;
        
    return numbers;
}
1
9 / 9 / 2
Регистрация: 14.07.2010
Сообщений: 166
23.12.2010, 11:23  [ТС] 3
Nameless One, а проще сделать можно?
0
grrrrr
23.12.2010, 12:00
  #4

Не по теме:


yardie, так намного интересней, зачем упрощать себе жизнь! :)

0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.12.2010, 13:01 5
Цитата Сообщение от yardie Посмотреть сообщение
Nameless One, а проще сделать можно?
Да куда уж проще?
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,591
23.12.2010, 13:11 6
Это решение, похоже, исходную строку модифицирует.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.12.2010, 13:14 7
lemegeton, ага, что я и написал в комментарии
0
lemegeton
23.12.2010, 13:16
  #8

Не по теме:

Меня сложно упрекнуть в чтении документации.

0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.12.2010, 13:31 9
Цитата Сообщение от lemegeton Посмотреть сообщение
Это решение, похоже, исходную строку модифицирует.
Вот без модификации исходной строки (также немного подправил условие в строке 41):
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define BUFFSIZE 80
#define MAXNUMCNT 20
 
int* getNumbers(const char*, int*, size_t, size_t*);
 
int main()
{
    char buf[BUFFSIZE + 1];
    int  nums[MAXNUMCNT];
    size_t cnt, i;
    puts("Введите строку чисел");
    fgets(buf, BUFFSIZE, stdin);
    getNumbers(buf, nums, MAXNUMCNT, &cnt);
    for(i = 0; i < cnt; ++i)
    printf("nums[%02u] = %d\n", i + 1, nums[i]); 
    return 0;
}
 
/* Функция будет разбирать строку str и разбивать ее на числа
 * которые будут храниться в массиве numbers, но не больше, чем
 * size чисел. Если указатель cnt не указывает на NULL, то в нем
 * возвращается количество распарсенных чисел
 * Строка уже не разрушается
 */ 
int* getNumbers(const char* str, int* numbers, size_t size, size_t* cnt)
{
    char* _str;
    if((_str = strdup(str)) == NULL)
    {
        perror("strdup");
        exit(1);
    }
    size_t n = 0;
    char *p = _str;
    char *q = _str;
        
    while(*q && (n < size))
    {
        if(*q == '|')
        {
            *q++ = '\0';
            numbers[n++] = atoi(p);
            p = q;
        }
        else
             ++q;
    }
        
    if(n < size)
        numbers[n++] = atoi(p);
        
    if(cnt)
        *cnt = n;
               
    free(_str); 
    return numbers;
}
0
9 / 9 / 2
Регистрация: 14.07.2010
Сообщений: 166
23.12.2010, 14:48  [ТС] 10
не понял вот эту строчку int* getNumbers(char*, int*, size_t, size_t*)
а именно (char*, int*, size_t, size_t*)
распишите по подробней, я ни как не магу врубиться что это и как это, вот сижу книгу читаю, ни как не найду(((
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.12.2010, 14:56 11
Это прототип функции getNumbers, принимающей параметрами указатель на char, указатель на int, переменную типа size_t и указатель на size_t и возвращающей указатель на int. Прототип просто объявляет интерфейс функции, которая будет определена позднее, при этом имена формальных параметров можно не указывать, достаточно указать только типы. Использовать прототип не обязательно, это всего лишь дело вкуса. В моем случае он нужен потому, что функция getNumbers определена ниже функции main. А можно было бы определить функцию выше функции main и избавиться таким образом от необходимости объявлять прототип функции

Глянь еще здесь
0
9 / 9 / 2
Регистрация: 14.07.2010
Сообщений: 166
23.12.2010, 15:06  [ТС] 12
Nameless One, ну с прототипом я знаком, я не пойму почему ты используешь size_t и делаешь ещё указатель *size_t
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.12.2010, 15:17 13
C
1
2
3
4
5
6
7
/* Функция будет разбирать строку str и разбивать ее на числа
 * которые будут храниться в массиве numbers, но не больше, чем
 * size чисел. Если указатель cnt не указывает на NULL, то в нем
 * возвращается количество распарсенных чисел
 * Строка разрушается
 */ 
int* getNumbers(char* str, int* numbers, size_t size, size_t* cnt);
size_t - это беззнаковый целый тип, поэтому логично его использовать для указания размера массива numbers. Переменная size указывает на размер массива numbers, т.е. на максимальное количество чисел, который он может хранить. Но в строке str может встретиться меньше чисел, чем size, именно поэтому нам нужен указатель cnt - в нем будет храниться количество реально распарсенных чисел; в дальнейшем это значение используется для того, чтобы вывести числа из массива на экран. Вообще возможны три варианта:
  1. в строке меньше чисел, чем size - тогда в numbers записываются все встретившиеся числа, а *cnt хранит реальное количество этих чисел (*cnt < size);
  2. в строке ровно size чисел - тогда все эти числа записываются в массив, и *cnt = size;
  3. в строке больше чисел, чем size - тогда в массив записывается ровно size чисел, *cnt = size, а все остальные числа в строке игнорируются.

Вообще можно было бы сделать динамически расширяющийся массив чисел, но тогда на пользователя возлагалась бы задача освобождения выделенной памяти
0
9 / 9 / 2
Регистрация: 14.07.2010
Сообщений: 166
23.12.2010, 16:10  [ТС] 14
а что эта запись значит char buf[BUFFSIZE + 1] ?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.12.2010, 16:15 15
yardie, объявляется строка (массив char) размера BUFFSIZE + 1. Кстати, там лучше было бы под строку выделить не BUFFSIZE + 1, а BUFFSIZE символов:
C
1
char buf[BUFFSIZE];
0
9 / 9 / 2
Регистрация: 14.07.2010
Сообщений: 166
23.12.2010, 16:16  [ТС] 16
а почему +1, это так для чего делать?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.12.2010, 16:25 17
Потому, что строки C обычно заканчиваются на символ '\0', который является признаком конца строки. Многие функции работы со строками неявно записывают этот символ в строку, либо ожидают, чтобы он там присутствовал. Таким образом, мы говорим: создать массив типа char, который может хранить до BUFFSIZE символов + завершающий символ '\0'.

Чуть выше я предложил исправить это объявление на
C
1
char buf[BUFFSIZE];
так как функция fgets прочитает как минимум на один символ меньше, чем мы укажем в соответствующем аргументе, который будет указывать на максимальный размер строки. Таким образом, в любом случае вызов функции fgets(buf, BUFFSIZE, stdin) прочитает не больше BUFFSIZE - 1 символов и обязательно вставит символ '\0' в конец результирующей строки. Таким образом, в данном случае выделять дополнительный символ для строки buf не надо.
0
21 / 21 / 7
Регистрация: 21.09.2010
Сообщений: 65
23.12.2010, 16:27 18
Этот плюс 1 для '\0' (ограничитель строки)
0
Nameless One
23.12.2010, 16:28
  #19

Не по теме:

Reee, слеш немного не в ту сторону ;)

1
Reee
23.12.2010, 16:29     Парсер массива
  #20

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение

Не по теме:

Reee, слеш немного не в ту сторону ;)

Ой...:-[

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2010, 16:29

Парсер
Для небольшой текстовой игрушки в жанре RPG нужен способ считывания данных из текстовых файлов. ...

Парсер на js
Здравствуйте, знаю обычно парсеры пишутся на php, но увы жизнь заставила... В общем нужно чтобы...

Парсер на С
вопшем есть файл с текстом..... в етом файле есть какие даные(мусор)...и есть дни:...

парсер на C#
Помогите пожалуйста, пробую написать парсер на c# сайта kinopoisk.ru, например первая строка (год)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru