Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Разделение строки на массив строк в СИ

61K
19 октября 2016 года
Максим Тесля
13 / / 10.12.2014
Здравствуйте.Нужна помощь по Си.Нужно написать код который который мог бы разделять строку, веденную пользователем ,на слова и эти слова заносились в массив строк.
Вот тут я ввожу строку и заношу ее в str.
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
    char *str;
    str=malloc(sizeof(*str) * 100)
    gets(str);
        printf("%s",str);
    return 0;
}
На сколько я понимаю далее нужно будет объявить массив строк и выделить под него память(как это делается не знаю) .Разделить str с помощью команды strtok и циклом занести все в новосозданный массив строк.

Си грубо не знаю.Делал похожие задание на шарпе 2 года назад.Честно говоря попроще было=)
Кто может настрочите код пожалуйста(думаю он будет не большой). Заранее благодарен.
11K
21 октября 2016 года
xAtom
65 / / 17.01.2011
Лови.
Код:
#include <stdio.h>
#include <string.h>
#include <malloc.h>

typedef struct {
    char** arr;
    size_t cnt;
} array_t;

#define array_init(a)  (a).arr = NULL, (a).cnt = 0
void array_clear(array_t* a);
int  array_resize(array_t* a, size_t n);
void array_strtok(array_t* a, char* s, const char* delim);

int main(void){
    array_t a;
    size_t  i;
    char    s[128];

    printf("Enter str: ");
    scanf("%127[^\n]", s);

    array_init(a);
    array_strtok(&a, s, " \r\n\t,.?!");
    for(i = 0; i < a.cnt; ++i)
        puts(a.arr[i]);
    array_clear(&a);
    return 0;
}

/* разбиение строки на слова */
void array_strtok(array_t* a, char* s, const char* delim){
    char*  i, *j;
    size_t m,  n = 0;
   
    /* подсчитываем кол-во слов */
    for(i = s; *i; i = j){
        while(*i && (strchr(delim, *i) != NULL))
            ++i;

        j = i;
        while(*j && (strchr(delim, *j) == NULL))
            ++j;

        if(j > i)
            ++n;
    }

    if(! array_resize(a, n))
        return;

    m = 0;
    for(i = strtok(s, delim); i != NULL; i = strtok(NULL, delim))
        a->arr[m++] = strdup(i);
}

/* удаление массива */
void array_clear(array_t* a){
    size_t i;
    if(a->arr != NULL){
        for(i = 0; i < a->cnt; ++i)
            free(a->arr[i]);
        free(a->arr);
        a->arr = NULL;
        a->cnt = 0;
    }
}

/* выделение памяти под массив */
int array_resize(array_t* a, size_t n){
    size_t i;
    array_clear(a);
    a->arr = (char**)malloc(n * sizeof(char*));
    if(a->arr == NULL)
        return 0;

    for(i = 0; i < n; ++i)
        a->arr[i] = NULL;
    a->cnt = n;
    return 1;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог