Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Работа со строками


Автор: Dmitriysokol 16.5.2010, 18:22
Добрый вечер, нужно получить массив строк образованный путем внесения в него частей введенной строки по принципу: строка в массиве должна заканчиваться определенным словом. попытка реализовать это через strtok не привела к желаемому результату, тк строка 1 делилась по принципу любого символа из заданного слова

Автор: 586 16.5.2010, 18:49
Код
#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;
}

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

Автор: Dmitriysokol 17.5.2010, 16:17
Код

#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;
}


вот я делал так, но как только он находит любой символ из заданного слова, то тут же делит строку, а необходимо чтобы он делил по целому слову

Автор: 586 17.5.2010, 16:46
Код
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;
  }
}

Автор: Dov 18.5.2010, 01:13
Цитата(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;
}


Автор: Dem_max 18.5.2010, 12:12
Цитата

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

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

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

Автор: Dmitriysokol 18.5.2010, 21:33
Dov , спасибо огромное, все работает как надо smile . вот только вопрос еще дополнительный возник: как вот эти разбитые строки записать в массив?

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)