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

Ваш аккаунт

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

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

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

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

43K
06 декабря 2008 года
2fasti
9 / / 01.12.2008
Привет. Вот функция, которая выделяет из строки слова, разделённые пробелами, в подстроки. К сожалению не работает корректно =(





Код:
#include <conio.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>


//константа, содержащая все русские буквы
#define Rus "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\
абвгдежзийклмнопрстуфхцчшщъыьэюя"

/*Функция выделяет подстроки, разделенные более чем тремя точками.
k - количество строк;n1 - количество подстрок (передается по адре-су);
str - исходный массив строк; str1 - массив подстрок;
num - массив с номерами строк, из которых были выделены подстроки*/

void substr(char str[81],char str1[][81],int*n1,int num[])
{ int i;
  char *s=str,*s1=str,*s2;//s - указатель на текущий символ
  // s1 и s2 – указатели на начало и на конец подстроки

  *n1=0;  //подстрок еще нет
  //for(i=0;i<n;i++)
  {
     //начало подстроки еще не обнаружено
     s=&str;//ставим указатель на текущий символ в начало строки
     while(*s)
         if(*s==' ') //возможно, найден конец подстроки
         {
            s2=s-1; //s2 указывает на символ перед точкой
            //пропуск точек : пока символ точка и не конец стро-ки
            while(*s==' '&&*s)
              s++;

            {
              if(s2>=s1&&s1)//если подстрока не пустая
//и найдено начало подстроки
              {
               //   num[*n1]=i; //запоминаем номер исходной строки
//копируем подстроку в массив подстрок
                strncpy(str1[*n1],s1,s2-s1+1);
                //добавляем нуль-символ в конец подстроки
str1[*n1][s2-s1+1]='\0';
                (*n1)++;//увеличиваем число подстрок
              }
            s1=s;//запоминаем начало следующей подстроки
          }
        }
     else s++;//если символ - не точка, берем следующий символ
     }
}

/*Функция находит среди выделенных подстрок первую, содержащую русскую букву. Возвращает -1 если таких подстрок не найдено, либо номер найденной подстроки */



void main()
{ int n=0,n1,num[100],f,i,k;
  char str [10][81],str1[10][81];

  clrscr();
  //ввод строк до пустой строки
  printf("Vvedite stroki: \n");
  fgets(str, sizeof(str), stdin);
  printf(str);
  substr(str,str1,&n1,num);//выделение подстрок
  if (n1==0)
     printf("Net postrok! \n");
  else
  {
     printf("Videleno %d podtrok: \n",n1);
     for(i=0;i<n1;i++)
        puts(str1);


  }

  getch();
}
38K
07 декабря 2008 года
Tooth
38 / / 07.10.2008
Цитата:
s=&str;//ставим указатель на текущий символ в начало строки


чему равно i ?
нужно сразу проинициализировать: int i=0;

43K
07 декабря 2008 года
2fasti
9 / / 01.12.2008
Я изменил условие на более простое, надеюсь теперь оно более понятное.
Бьюсь с этим уже два часа. Есть строка типа "Leninu sto let", её надо разбить на массив:

Leninu
sto
let

Не получается
38K
07 декабря 2008 года
Tooth
38 / / 07.10.2008
чего-то ты всё запутал...

Код:
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
//---------------------------------------------------------------------------
void  _substr(char str[81], char str1[][81],int& n1);
bool is_letter(char);
//------------------------------------------------------------------
int main(int argc, char* argv[])
{
char str[80]={0};
char substr[10][81]={0};
int count=0;
while(!strlen(gets(str))){};
_substr(str,substr,count);
printf("the string contain %d word:'s\n\n",count);
for(int i=0;i<count;++i)
    {
    printf("%d)  %s\n",i+1,substr);
    }
  getch();
   return 0;
}
//---------------------------------------------------------------------------
void  _substr(char str[81], char str1[][81],int& n1)
{
char temp[81]={0};
char *ptr1=str,*ptr2=temp;
int count=0,len=strlen(str);
while (ptr1<(str+len))
    {
     n1++;
     while(is_letter(*ptr1))
        {
        *ptr2=*ptr1;
        ptr2++;ptr1++;
        if(ptr1>(str+len)) break;
        }
     *ptr2=0;
     strcpy(str1[count],temp);
     count++;
     memset(temp,0,81);
     ptr2=temp;
     while(!is_letter(*ptr1))
        {
        ptr1++;
        if(ptr1>(str+len)) break;
        }
     if(ptr1>(str+len))break;
    }
}
//---------------------------------------------------
bool is_letter(char c)
{
return(c<='z' && c>='0');
}
342
07 декабря 2008 года
Yos
209 / / 21.06.2003
Вот кодец на все случаи жизни :)
Код:
//*************************************************************
//**
//** Получение строкового элемента из последовательности
//**
//*************************************************************
BOOL XString::GetSequenceString(LPSTR pSource, DWORD index, LPSTR pSeparators, LPSTR pItem)
{
 //****
 DWORD  count;
 DWORD  i;
 DWORD  j;
 DWORD  n;
 
 BOOL   search;

 // проверка параметров на корректность
 if( !pSource ) return FALSE;
 if( !pSeparators ) return FALSE;
 if( !pItem ) return FALSE;

 // обнуляем счетчик
 count = 0;
 // начинаем процесс выборки
 for( i=0,j=0; *(pSource+i); i++ )
 {
    // сбрасываем признак найденного разделителя
    search = FALSE;
    // начинаем процесс сопоставления разделителей
    for( n=0; *(pSeparators+n); n++ )
    {
        // если один из разделителей из их списка найден
        if( *(pSource+i) == *(pSeparators+n) )
        {
            // устанавливаем признак найденного разделителя
            search = TRUE;
            // закрываем подготовленный элемент последовательности
            *(pItem+j) = 0x00;
            // если позиция подготовленного элемента равна
            // требуемой, возвращаем элемент
            if( count == index ) return TRUE;
            // иначе увеличиваем счетчик найденных элементов
            count++;
            // сбрасываем в начало счетчик записи для буфера памяти
            // подготавливаемого элемента
            j = 0;
            // и обнуляем элемент последовательности
            *(pItem) = 0x00;
        }
    }

    // если же разделитель не был найден
    if( !search )
    {
        // дополняем буфер подготавливаемого элемента
        // символом из последовательности
        *(pItem+j) = *(pSource+i);
        // увеличиваем позицию записи
        j++;
    }

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

 // закрываем подготовленный элемент
 *(pItem+j) = 0x00;
 // если позиция подготовленного элемента равна
 // требуемой, возвращаем элемент
 if( count == index ) return TRUE;

 // иначе обнуляем элемент последовательности
 *(pItem) = 0x00;
 // и выходим с "пустой" строкой
 return FALSE;
}


Вообщем принцип я и так думаю понятен - делить можно практически все - пути, предложения и тд и тп, главное правильно задать список разделителей которые могут задаваться в виде (для вашего случая) " " (можно и ",. "), а для путей "\\/".

Вообщем пользуйтесь...
43K
07 декабря 2008 года
2fasti
9 / / 01.12.2008
Спасибо, ребят :-)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог