Примеры на выделение слов из текста



ЛАБОРАТОРНАЯ РАБОТА 8

ОБРАБОТКА ТЕКСТОВОЙ ИНФОРМАЦИИ. СТРОКИ

 

Текст - это последовательность символов. Строка в Си – это массив символов кодировки ASCII расширенная, заканчивающийся символом \0.

 

Строки, как статические массивы

Определение строковых переменных

    char ps1[10],ps2[10]=”sssss”, // памяти под 10 элементов из них 1 под \0

    ps3[]=”ggggggg”,     // \0 в 6-ой позиции

    ps4[]=”ffffffffffffffffff\         //инициализация длинными строками\        

              aaaaaaaaaaaaaaaaaaaaa;     //операция продолжения

Объем памяти для переменной строкового типа = размеру массива, но количество символов в строке на 1 меньше.

В ps2 текст займет 4 ячейки строки и в 5 будет \0. если определить для ps2 текст больше 10 символов, то компилятор выдаст сообщение об ошибке.

Строки как указатели

char s[256]; s – указатель на первый байт выделенного участка памяти, так как s определена как массив.

char *str; str – это указатель на строку или просто строка.

Операции

· присваивать строкам нельзя

char *s1,*s2;

s1=”hhhhhhh”;

s2=”ffffffff”;

· инициализировать можно, но нежелательно.

nt _tmain(int argc, _TCHAR* argv[])

{

char *ps="1234"

cout<<ps;          //выведет 1234

cin.get();

cin.get();

return 0;

 

· вводить в переменные – указатели, если не выделена память, нельзя

{

char *s1,*s2;

gets(s1); // ошибка времени выполнения, так как память s1 не выделена.  

}

· Присваивать однотипные указатели можно

nt _tmain(int argc, _TCHAR* argv[])

{

char *ps="1234",//и добавляет \0

       s2[256];

int i;

puts("Введите строку");

scanf("%s",s2);         //12345678

ps=s2;

puts(ps);               //12345678

     

return 0;

}

Динамические строки

Создание динамической строки (переменной) из 100 символов:

char *s1=(char *) malloc (sizeof(char)*100); //создание динамической строки под 100 символов

if (s1) // проверка создания дин. переменной, если s1!=NULL или 0

gets(s1);   

else

puts(“память не выделена”);       

}

 

Строковая константа

Это текст, заключенный в кавычки, например:˝Текст˝. Пустая строка определятся константой вида: ˝˝.

Операции со строкой

Присваивание

Присваивать строкам нельзя!!!!!

char ps1[256];

ps1="hhhhhhh";  //Присваивать массивам нельзя, т.к.ps1 – константный указатель

Ввод строк в стиле С

Целой строкой

Функции ввода и вывода строк

Из библиотеки stdio.h

char * gets(char *);// читает до \n, но запоминает столько, сколько введено и устанавливает \0 после последнего прочитанного символа. Возвращает введенную строку.

Примечание.

Количество символов, считываемых gets(str), не ограничивается. Поэтому программист должен сам следить за тем, чтобы не выйти за границы массива, на который указывает str.

int scanf(const char*, ….); // в формате s, до первого пробела или \n и запоминает столько, сколько введено. Устанавливает \0 после последнего прочитанного символа.

Примечание. Возвращаемое значениеЭта функция возвращает число успешно преобразованных и назначенных полей. В возвращаемом значении не содержится число прочитанных но не назначенных полей. При попытке считывания конца файла возвращается значение EOF. Возвращаемое значение 0 указывает, что нет назначенных полей.

сhar * fgets( char * string, int num, FILE * filestream );  - Функция fgets считывает символы из потока и сохраняет их в виде строки в параметр string до тех пор пока не наступит конец строки или пока не будет достигнут конец файла. Символ новой строки прекращает работу функции fgets, но он считается допустимым символом, и поэтому он копируется в строку string. Нулевой символ автоматически добавляется в строку str после прочитанных символов, чтобы сигнализировать о конце строки.Параметр num – задаетмаксимальное количество символов для чтения, включая нулевой символ. Параметр filestream – задает указатель на объект типа FILE, который идентифицирует поток, из которого считываются символы. Для чтения из стандартного потока (клавиатуры, поток stdin) , stdin может быть использован в качестве значения этого параметра.

Возвращаемое значение.

В случае успеха, функция возвращает указатель на string. Если конец файла был достигнут и ни один символ не был прочитан, содержимое string остается неизменными и возвращается нулевой указатель. Если происходит ошибка, возвращается нулевой указатель. Используйте функции ferror или feof для проверки, произошла ошибка или был достигнут конец-

 char *puts(char *s1);         // выводит строку s1 и \n (перевод каретки)

int printf(const char *s1 ……);// выводит  и значения строковых переменных  в формате %s

Пример 1. Особенности ввода статической строки функцией gets

 

int _tmain(int argc, _TCHAR* argv[])

{

     

char ps3[256]="123",//и добавляет \0

       s2[5], s3[4];;

int i;

setlocale(LC_ALL,"rus");

puts("Введите строку длиной не более 4 символов");

gets(s2);

int k=0;

for(i=0;s2[i]!='\0';i

       k++;

printf(" k= %d s2= %s",k, s2);

getchar();

return 0;

}

Тест 1

Тест 2

Введенное число вышло за размер выделенной памяти.

 

Пример 2. Варианты ввода и вывода строк операторами scanf, puts, printf.

 

int _tmain(int argc, _TCHAR* argv[])

{

char ps3[256]="123",//и добавляет \0

       s2[5],s3[10];

int i;

puts("Введите строку");

scanf("%s",&s2);        //вх.поток: 123 456789

int k=0;

for(i=0;s2[i]!='\0';i++)

       k++;

cout<<k;                //к=3

puts(s2);               //выведет 123

cin.get();

cin.get();

return 0;

}

 

Посимвольный ввод строки

int scanf(char*, ….); // в формате с

char getchar (void);   // чтение символа в Си

Пример 3. Заполнение строк: вводить как массив поэлементно, но надо добавить в конце \0, чтобы далее работать как со строкой.

int main(int argc, char* argv[])

{

 char ps4[5];

setlocale(LC_ALL,"rus");

       puts("Введите строку из "4 символов);

       for(int i=0;i<4;i++)

        ps4[i]=getchar();               //или scanf(“%c”,&ps4[i]);

ps4[i]=’\0’;//для корректной работы со строкой

// иначе будут обрабатываться все ячейки следующие за

//последним введенным символом

printf(“ Введена строка %s:”,ps4);                                    

       return 0;

}

 

Ввод-вывод в стиле С++

Строки целиком

istream * cin.getline(char *s1, int K,char ch=’\n’);//читает строку и \n и записывает в s1 K-1 символов, в позиции с 0 по K-2, а в позицию K-1 записывает \0 значение К должно быть равно или больше количества вводимых символов

istream * cin.get(char *s1, int K,char ch=’\n’);//читает строку до \n (его не читает) и записывает в s1 K-1 символов, в позиции  с 0 по K-2, а в позицию K-1 записывает \0 значение К должно быть равно или больше количества вводимых символов. Иначе создается блокировка ввода строки.

cin>>строка; читает текст до первого разделителя: пробел, табуляция, \n.

cout<< строка // выводит строку до \0 и не выводит \n

cout.put(char)                             //выводит символ

Пример 4. Варианты ввода строковых значений оператором cin.getline()

{

    char ps1[256],ps2[256];

cin.getline(ps1,256,’\n’);   //читает строку до \n, т.е. если ввести текст 123

                                 то в ps1 будет строка 123

cin.getline(ps2,7);              //Может быть заблокирован дальнейший ввод,

                                 //если вводимых символов будет больше 7

cin.getline(ps2,10,’#’); // читает всю строку до \n, но вводит в //переменную только до # Например, //aaaaaaa#aaa\n в ps1 будет текст aaaaaaa

}

 

Посимвольный ввод строки

    В стиле С++ (потоковый ввод)

int  cin.get(char &); читает символ из потока

char cin.get(); читает символ из потока

cin>>символьная переменная;

Пример 5. Заполнение строк: вводить как массив поэлементно, но надо добавить в конце \0, чтобы далее работать как со строкой.

int main(int argc, char* argv[])

{

 char ps4[5]

        

    for(int i=0;i<4;i++)

     cin.get(ps4[i]);   

ps4[i]=’\0’;//для корректной работы со строкой

// иначе будут обрабатываться все ячейки следующие за

//последним введенным символом

cout<<ps4;

    return 0;

}

Примеры на выделение слов из текста

Пример 6. Дано предложение, состоящее из слов. Слова отделяются друг от друга одним пробелом. Красной строки нет. Вывести все слова текста. Текст рассматривать как строку максимальный размер 1024 символа, слово тоже строка размером не более 20 символов.

Метод решения: полный перебор символов и формирование слова, как массива символов

Тест: 12 34 56 78

void slova(char *s)

{

char slovo[20];

int i,j;i=0;

while(s[i]!='\0') //до конца текста

{

       j=0;

       while(s[i]!='\0' && (s[i])!=' ') //до конца слова

       {

             slovo[j]=s[i];i++;j++;

       }

slovo[j]='\0'; //уйти с разделителя слова, если оно

// не последнее

puts(slovo);

       if(s[i]!='\0') i++;         

}

 

}

int _tmain(int argc, _TCHAR* argv[])

{

char str[1024];

     

cout<<"Vvedite tekst";

gets(str);

slova(str);

return 0;

}

Пример 7. Дано предложение, состоящее из слов. Слова отделяются друг от друга одним или несколькими пробелами. Есть красная строка . Вывести все слова текста. Текст рассматривать как строку максимальный размер 1024 символа, слово тоже строка размером не более 20 символов.

Метод решения:

- полный перебор символов и формирование слова, как массива символов;

-пропуск пробелов красной строки;

- формирование слова;

- пропуск пробелов между словами

Тест:         12     34   56   78

void slova2(char *s)

{

char slovo[20];

int i,j;i=0;

while(s[i]!='\0')

{

       while(s[i]!='\0' && (s[i])==' ') //пропуск пробелов

       {

             i++;

       }

       if(s[i]!='\0')                      //формирование слова

       {

       j=0;

       while(s[i]!='\0' && (s[i])!=' ')

       {

             slovo[j]=s[i];i++;j++;

       }

       slovo[j]='\0';puts(slovo);

       if(s[i]!='\0') i++;

       }

           

}

 

}

int _tmain(int argc, _TCHAR* argv[])

{

char str[1024];

char **mas=0;

int l;

char *razd=" ,.!?";

cout<<"Vvedite tekst";

gets(str);

slova2(str);

return 0;

}

Пример 8. Дано предложение, состоящее из слов. Слова отделяются друг от друга одним или несколькими пробелами или другими символами разделителями, например: запятая, дефис, точка. Есть красная строка . Вывести все слова текста. Текст рассматривать как строку максимальный размер 1024 символа, слово тоже строка размером не более 20 символов.

Метод решения:

- полный перебор символов и формирование слова, как массива символов;

-пропуск пробелов красной строки и других разделителей;

- формирование слова;

- пропуск пробелов и других разделителей между словами

void slova3(char *s)

{

char slovo[20];

int i,j;i=0;

while(s[i]!='\0')

{

       while(s[i]!='\0' && (s[i]==' '|| (s[i]==','|| s[i]=='.'|| s[i]=='?'))) //пропуск разделителей

       {

             i++;

       }

       if(s[i]!='\0')                      //формирование слова

       {

       j=0;

       while(s[i]!='\0' && (s[i])!=' '&& s[i]!=','&& s[i]!='.'&& s[i]!='?')

       {

             slovo[j]=s[i];i++;j++;

       }

       slovo[j]='\0';puts(slovo);

       if(s[i]!='\0') i++;

       }

           

}

 

}

 

int _tmain(int argc, _TCHAR* argv[])

{

char str[1024];

char **mas=0;

int l;

char *razd=" ,.!?";

cout<<"Vvedite tekst";

gets(str);

slova3(str);

return 0;

}

Пример 9. Дано предложение, состоящее из слов. Слова отделяются друг от друга одним или несколькими пробелами или другими символами разделителями, например: запятая, дефис, точка. Есть красная строка . Вывести все слова текста. Текст рассматривать как строку максимальный размер 1024 символа, слово тоже строка размером не более 20 символов.

Удаление обработанных слов и разделителей из текста на основе указателя.

Метод решения:

- полный перебор символов и формирование слова, как массива символов;

-пропуск пробелов красной строки и других разделителей;

-сместить указатель на начало слова (после разделителей);

- формирование слова, вывод;

- смещение указателя на длину слова, т.е. на начало разделителей

 

void slova4(char *s)

{

char slovo[20];

int i,j;i=0;

     

while(s[i]!='\0')

{

           

while(s[i]!='\0' && (s[i]==' '|| (s[i]==','|| s[i]=='.'|| s[i]=='?'))) //пропуск разделителей

       {

             i++;

       }

       if(s[i]!='\0')                      //формирование слова

       {s=s+i;i=0;  //удаление разделителей, путем изменения

//указателя сдвинув tuj на i cbволов вправоо и //корректирока индекса i в 0.

       //puts(s);

           

       j=0;

while(s[i]!='\0' && (s[i])!=' '&& s[i]!=','&& s[i]!='.'&& s[i]!='?')

       {

             slovo[j]=s[i];i++;j++;

       }

       slovo[j]='\0';puts(slovo);

       s=s+j;

       if(s[i]!='\0') i++;

       }

           

}

 

}

 

int _tmain(int argc, _TCHAR* argv[])

{

char str[1024];

char **mas=0;

int l;

char *razd=" ,.!?";

cout<<"Vvedite tekst";

gets(str);

//create_mass_word(str,razd, mas, &l);

//out_massiv(l,mas);

slova4(str);

return 0;

}

 

Функции для строк

Функции из файла string.h

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

 int strlen(char *)

Результат- количество символов в строке

 

Пример.

int main()

{

    char s[56]=˝abcde”;

    cout<<strlen(s); //вывод 5

}

 


Дата добавления: 2018-04-05; просмотров: 464; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!