#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();
}
Выделение подстрок из строки
Привет. Вот функция, которая выделяет из строки слова, разделённые пробелами, в подстроки. К сожалению не работает корректно =(
Цитата:
s=&str;//ставим указатель на текущий символ в начало строки
чему равно i ?
нужно сразу проинициализировать: int i=0;
Бьюсь с этим уже два часа. Есть строка типа "Leninu sto let", её надо разбить на массив:
Leninu
sto
let
Не получается
Код:
#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');
}
#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');
}
Код:
//*************************************************************
//**
//** Получение строкового элемента из последовательности
//**
//*************************************************************
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;
}
//**
//** Получение строкового элемента из последовательности
//**
//*************************************************************
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;
}
Вообщем принцип я и так думаю понятен - делить можно практически все - пути, предложения и тд и тп, главное правильно задать список разделителей которые могут задаваться в виде (для вашего случая) " " (можно и ",. "), а для путей "\\/".
Вообщем пользуйтесь...
Спасибо, ребят :-)