Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со строками, разделить строку после определенно слова 
:(
    Опции темы
Dmitriysokol
  Дата 16.5.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.4.2010

Репутация: нет
Всего: нет



Добрый вечер, нужно получить массив строк образованный путем внесения в него частей введенной строки по принципу: строка в массиве должна заканчиваться определенным словом. попытка реализовать это через strtok не привела к желаемому результату, тк строка 1 делилась по принципу любого символа из заданного слова
PM MAIL   Вверх
586
Дата 16.5.2010, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Код
#include <stdlib.h>
#include <stdio.h>

size_t CreateStringArray(const char *str, const char *word, char ***ptrArr)
{
    size_t wordLength, nArray;
    const char *p = str, *q = str;
    char **arr = 0;

     if(!ptrArr) return 0;
     wordLength = strlen(word);
     p = str;
     q = str;
     arr = 0;
     nArray = 0;
     while((p = strstr(p, word)) != 0)
     {
         arr = realloc(arr, (nArray+1)*sizeof(char*));
         arr[nArray] = malloc(p-q+wordLength+1);
         memcpy(arr[nArray], q, p-q+wordLength);
         arr[nArray][p-q+wordLength] = '\0';
         ++nArray;
         p += wordLength;
         q = p;
     }
      *ptrArr = arr;
      return nArray;
}

int main()
{
    char buf[260], **arr;
    size_t n, i;

    printf("Enter string: ");
    fgets(buf, 260, stdin);

    n = CreateStringArray(buf, ".", &arr);
    printf("Total %u lines\r\n", n);

    for(i = 0; i < n; ++i)
        printf("item[%u]=\"%s\"\n", i, arr[i]);

    for(i = 0; i < n; ++i)
        free(arr[i]);
    free(arr);

    fflush(stdin);
    getchar();
    return 0;
}

PM   Вверх
Dmitriysokol
Дата 16.5.2010, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.4.2010

Репутация: нет
Всего: нет



 как нить попроще можно с использованием функций из string.h ну и остальных стандартных
PM MAIL   Вверх
Dmitriysokol
Дата 17.5.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.4.2010

Репутация: нет
Всего: нет



Код

#include <iostream.h>
#include <string.h>
#include <stdio.h>
void in_data (char [], char []);
void obr (char [], char[], char[][25]);
void out_data (char [][25]);

void main (void)
{
  char str_in[25], str_out[5][25], word[5];

  in_data(str_in, word);
  obr (str_in, word, str_out);
  out_data (str_out);
}

void in_data (char str[], char word[])
{
  cout << "Vvedite stroky";
  gets (str);
  cout << "vvedite slovo";
  gets (word);
}

void obr (char str1[],char word[],char str2[][25])
{
  char *p;
  p=strtok(str1,word);
  while (p!=NULL)
  {
    cout << p <<endl;
    p=strtok (NULL,word);
  }
}

void out_data (char str[])
{
  cout << endl << str << endl;
}


вот я делал так, но как только он находит любой символ из заданного слова, то тут же делит строку, а необходимо чтобы он делил по целому слову
PM MAIL   Вверх
586
Дата 17.5.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Код
void obr (char str1[],char word[],char str2[][25])
{
  char *p = str1, *q = str1;
  int i = 0;
  int wordLength = strlen(word);

  while((p = strstr(p, word)) != 0)
  {
    int lineWidth = p-q;
    memcpy(str2[i], q, lineWidth+wordLength);
    str2[i][lineWidth+wordLength] = '\0';

    cout << str2[i] << '\n';

    p += wordLength;
    q = p;
    ++i;
  }
}

PM   Вверх
Dov
Дата 18.5.2010, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Dmitriysokol @  16.5.2010,  22:42 Найти цитируемый пост)
как нить попроще можно с использованием функций из string.h ну и остальных стандартных

Как то так. Если что, напильником подработать.  smile  
Код
int main()
{
    char  str[256], word[21];
    char *p, *buf[100] = {str};
    int   wordLen, size = 0; 

    printf("enter a string: ");
    gets(str);
    printf("enter a word  : ");
    gets(word);    
    wordLen = strlen(word);

    while((p = strstr(buf[size], word)) != NULL)
    {
        *(p + wordLen) = '\0';        
        buf[++size] = p + wordLen + 1;
    }

    puts("\nresult:");    
    for(int i = 0; i < size; i++)
        puts(buf[i]);

    return 0;
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Dem_max
Дата 18.5.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

как нить попроще можно с использованием функций из string.h ну и остальных стандартных

нет нельзя , так как ты сам поставил жесткое условие 
Цитата

строка в массиве должна заканчиваться определенным словом



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Dmitriysokol
Дата 18.5.2010, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.4.2010

Репутация: нет
Всего: нет



Dov , спасибо огромное, все работает как надо smile . вот только вопрос еще дополнительный возник: как вот эти разбитые строки записать в массив?
PM MAIL   Вверх
Dov
Дата 18.5.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Dmitriysokol,  а что ты называешь массивом строк? Например, в моей программе есть массив указателей, которые указывают на полученные  'строки' .  Можешь называть его 'массивом строк' . Или что ты имеешь ввиду?


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1411 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.