Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы_по_проге_Берлин / Книги / учебное пособие ОАиП.pdf
Скачиваний:
49
Добавлен:
11.02.2015
Размер:
947 Кб
Скачать

void main()

// функция определения длины строки

{ char s[5];

 

char *st;

// вариант 1 ввода строки s

 

gets(s);

// ввод строки s

st=s;

// st указывает на строку s

printf("\n s=%s *st=%s",s,st);

 

// вариант 2 ввода строки s

st=gets(s);

// ввод строки s и указателя st на нее одновременно

printf("\n s=%s *st=%s",s,st);

}

Во втором варианте ввода сроки gets возвращает не только символьную строку s, но и инициализирует указатель на нее st. В первом варианте для получения адреса строки s в st выполняли st=s. Если в приведенном примере использовать в качестве аргумента в функции gets() указатель st, то он должен быть до этого инициализирован, например:

st=(сhar *) malloc(sizeof(char)*5);

При этом указатель st уже будет указывать на зарезервированные 5 байт памяти, отведенные под строку.

Кроме того, функция gets() включает разряд проверки ошибки. То есть если произошла ошибка ввода или gets() встретила символ EOF, она возвращает нулевой адрес (NULL). Это упрощает контроль на EOF:

char s[10]; while(gets(s)!=NULL);

по сравнению с тем, как это выполняется при использовании функции getchar():

char s; while((s=getchar())!=EOF);

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

Функция puts() предназначена для вывода символьной строки. В качестве единственного аргумента является указатель на выводимую строку:

char st[5];

 

. . .

( тело функции )

puts(st);

 

Функции работы со строками.

К числу наиболее часто используемых функций работы со строками можно отнести следующие: strlen(), strcat(), strcmp(), strcpy() и другие [3,10,11].

Примеры программ

Пример . Удалить из строки символов подстроку заключенную в [ ].

#include<stdio.h>

#include<stdlib.h>

#include<conio.h> void main()

{char *ss; int i,j,k,n;

scanf("%d",&k); ss=(char *)malloc(k);

printf("введите строку символов "); fflush(stdin); // чистка входного буффера gets(ss);

printf("\nИсходная строка символов : %s",ss);

j=-1;

// позиция открывающей скобки '[' в строке

for(i=0;*(ss+i);i++)

// цикл прохода по строке до ее конца

{ if (*(ss+i)=='[')

// скобка найдена

{ j=i;

 

while(*(ss+ ++j)!=']' && *(ss+j)!='[' && *(ss+j));

if (*(ss+j)=='[') i=j-1; // позиция вложенной скобки [ (теперь

//основной)

//во внешнем цикле по i увеличится значние i

else if(*(ss+j++)==']') // позиция закрывающей скобки

{n=i;

while(1)

if(!(*(ss+n++)=*(ss+j++))) break; // сжатие строки (удаление

//подстроки)

i--; // после сжатия надо проверить первый из символов // сдвинутых на [...] не является ли он сам [

}

}

}

printf("\nCжатая строка символов : %s",ss);

}

Пример . Ввести символьную строку и выполнить в ней удаление предпоследнего слова. Слова в строке разделены одним пробелом.

#include <stdio.h> #include <stdlib.h> main()

{int kk,k,n; char *s;

puts("введите длину строки "); scanf("%d",&n);

s=(char*)malloc(n);

 

if(!s) return 0;

//

ошибка выделения памяти

fflush(stdin);

//

чистка входного потока

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

gets(s);

puts("исходная строка: ");

puts(s);

 

 

 

k=0;

 

 

 

while(*(s+k))

k++;

// переход в конец строки. k – позиция ‘\0’

while(*(s+k)!=' ') k--; // позиция пробела перед последним словом

kk=k--;

 

// запоминаем в kk позицию пробела и сдвиг на

 

 

// последний символ предпоследнего слова в строке

while(*(s+k)!=' ') k--; // позиция пробела перед предпоследним словом

while(*(s+ ++k)=*(s+ ++kk)); // удаление предпоследнего слова (запи-

 

 

 

// сываем на его место последнее слово)

puts("преобразованная строка: ");

puts(s);

 

 

 

}

 

 

 

Пример

.

Ввести

символьную строку и выполнить в ней замену

местами последнего и предпоследнего слов.

#include <stdio.h>

 

#include <stdlib.h>

 

main()

 

 

 

{ int kk,k,n;

 

 

 

char *s,*s1,t;

 

 

scanf("%d",&n);

 

s=(char*)malloc(n);

// выделение памяти без инициализации

s1=(char*)calloc(n,1);

// выделение памяти с инициализацией

if(!s||!s1) return 0;

 

fflush(stdin);

 

 

gets(s);

 

 

 

k=0;

 

 

 

while(*(s+k)) k++;

// переход в конец строки. k – позиция ‘\0’

while(*(s+k)!=' ') k--; // позиция пробела перед последним словом

k--;

while(*(s+k)!=' ') k--; // позиция пробела перед предпоследним словом

kk=++k;

// запоминаем позицию первого символа этого слова

n=0;

// перезапись в строку s1 предпоследнего слова

while(*(s+k)!=' ') *(s1+n++)=*(s+k++);

k++;

// запись последнего слова на предпоследнее

while(*(s+k)) *(s+kk++)=*(s+k++);

*(s+kk++)=' ';

// вставка пробела после слова

n=0;

// дозапись слова из строки s1

while(*(s+kk++)=*(s1+n++));

printf("%s",s);

 

free(s); free(s1);

// освобождение памяти

}

 

Пример . Создать массив указателей на слова для каждой вводимой строки. Строка может содержать до 10 слов. Используя массив указателей исключить из каждой строки cлово с максимальной длинной.

#include <stdio.h> #include <stdlib.h> #define size 2

void fff(char *,char *); void main()

{char *st[size][10],*mst,*pst; int i,j,n=0,k=0,kk=0;

n=0; do

{ st[n][0]=(char *)malloc(20); // выделение памяти под строку gets(st[n][0]); // ввод строки

} while(*st[n++][0]); n--;

for(i=0;i<n;i++)

{k=0;

for(j=0; *(st[i][0]+j); j++)

if(*(st[i][0]+j)==' ')

// найден пробел - конец слова

st[i][++k]=st[i][0]+j+1; // адрес начала слова

st[i][++k]=st[i][0]+j+1;

// адрес ’\0’ (для последнего слова)

for(; k<9; )

 

st[i][++k]=NULL;

// остальные адреса для слов в строке

}

 

for(i=0; i<n; i++)

// перебор строк

for(j=0; st[i][j]; j++)

// перебор слов в строке

fff(st[i][j],st[i][j+1]);

// сравнение 2 слов для поиска max

for(i=0; i<n; i++) puts(st[i][0]);

}

void fff(char *st1,char *st2)

{int i; static j;

static char *k;

j=(st2-st1>j) ? k=st1,j=st2-st1 : j;

//j - длина максимального слова

//k - указатель на начало этого слова

if (!st2)

// передано не одно слово

{for(; j>0; j--)

{ for(i=0; *(k+i+1); i++)

*(k+i)=*(k+i+1); // сдвиг строки на позицию max слова

*(k+i)='\0';

}

}

}

Пример . Ввести символьную строку и найти в ней слово максимальной

длины.

 

#include <stdio.h>

 

#include <stdlib.h>

 

#include <conio.h>

 

main()

 

{ char *st;

 

int i,k,kk=0,i1,i2,i3,size;

 

printf("Введите длину строки");

 

scanf("%d",&size);

 

st=(char *)malloc(size);

 

fflush(stdin);

 

gets(st);

 

i=i1=i2=0;

 

while(*(st+i))

 

{ i3=i;

// индекс начала слова в втроке

for(k=0; *(st+i)!=' ' && *(st+i); i++,k++);

if(kk<k) { kk=k; i1=i3; i2=i; }

// координаты max слова

if(*(st+i)==' ') while(*(st+(++i))==' '); //удаление повторных пробелов

}

puts("\nслово max длины "); for(i=i1; i<i2; printf("%c",*(st+i++)));

}

Пример . Ввести строку и выполнить в ней замену слова с минимальной и максимальной длинной.

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

main()

{ char c,*s,*s1,*s2;

int i,n,nn,min,max,i1,i2,l,i3,i4; clrscr();

puts("");

scanf("%d",&nn);

s=(char*)malloc(nn);

s1=(char*)calloc(nn,1);

s2=(char*)calloc(nn,1); if(!s||!s1||!s2) return 0; fflush(stdin);

gets(s);

i=i1=i2=0; min=nn; max=0; while(*(s+i))

{ for(n=0;*(s+i)!=' ' && *(s+i); i++,n++); if(max<n) { max=n; i1=i-n; }

if(min>n) { min=n; i3=i-n; }

if(*(s+i)==' ') while(*(s+(++i))==' ');

}

l=0; i=i1;

while(*(s+i)!=' ' && *(s+i)) *(s1+l++)=*(s+i++);

l=0; i=i3;

while(*(s+i)!=' ' && *(s+i)) *(s2+l++)=*(s+i++);

l=0;

if(i1<i3)

{ i2=i1+max;

while(*(s2+l)) *(s+i1++)=*(s2+l++); while(i2<i3) *(s+i1++)=*(s+i2++); l=0;

while(*(s1+l)) *(s+i1++)=*(s1+l++);

}

else

{ i=i1+max-min;

while(*(s2+l)) *(s+i++)=*(s2+l++); i2=i-min-1; i1--; while(i1>=i3+min) *(s+i2--)=*(s+i1--);

l=0;

while(*(s1+l)) *(s+i3++)=*(s1+l++);

}

puts(s);

free(s);

free(s1);

free(s2);

}

Пример . Ввести строки. Определить, какие строки из введенных читаются из начала в конец и наоборот

#include <stdio.h> #include <conio.h>