10 Символдық жолдармен жұмыс
СИ тілінде символдар жолын енгізуге және шығаруға арналған екі ыңғайлы puts және gets функциялары бар. Оларды пайдалану мысалын қарастырайық:
#include
main()
{
char q[40]; /*символдар жолын сипаттау*/
puts(“Символдар жолын енгізіңіз ”);
gets(q); /*символдар жолын енгізу */
puts(q); /* символдар жолын шығару */
}
Программаның жұмысы нәтижесінде экранда алдымен келесі мәтін пайда болады:
Символдар жолын енгізіңіз
Содан кейін кез келген символдық жолды енгізу қажет. Енгізілген жолдың әрбір символы gets операторының көмегімен q массивінің элементтеріне меншіктеледі. Символдарды puts операторы шығарады.
-
Символдық жолдар және олардың жадыда орналасуы
Символдық жол – бұл char типті массив болып табылады. Жол бос литерамен, яғни (‘\0’) символымен аяқталады. Бұл дегеніміз ешқандай символ тұрмағанын білдіреді. Компилятор бұл символды автоматты түрде жолдың соңғы символынан кейін қояды. Мысалы «Сәлем!» символдық жолы жадыда келесідей орын алады:
-
Символдық жол үшін жадыны дайындағанда бір байтты жолдың аяқталу белгісіне жіберу керектігін ұмытпау қажет.
Символдық жолдарды инициализациялау тәсілдері
1 тәсіл. char stroka [ ] = “Cәлем!”;
2 тәсіл. char stroka [ ] = {‘С’, ‘ә’, ‘л’, ‘е’, ‘м’, ‘!’, ‘\0’};
Осындай инициализацияда міндетті түрде ‘\0’ - бос литераны қосу қажет.
3 тәсіл. char *str; str = ” Сәлем!”; немесе char *str = “Сәлем!”;
Бұл тәсілде көрсеткіш пайдаланылады. Есть и третий способ инициализации с помощью указателей. При этом, как и в двух выше описанных случаях, не нужно заранее выделять память для строки. Компилятор по внешнему виду строки определит необходимое количество байтов, в том числе один байт на символ конца строки. Например:
Это же самое можно записать так:
Иной путь выделения памяти заключается в явном ее задании. Во внешнем описании мы могли бы указать;
char m1[13] = “одна_строка”;
В этом случае все неиспользованные элементы автоматически инициализируются нуль–символом, как показано на рис.2.
----------------------------------------------
| о | д | н | а | с | т | р | о | к | а | \0 | \0 |
----------------------------------------------
Рис.2.
2. Ввод и вывод символьных строк
В лабораторной работе №1 уже упоминалась функция gets ( ), считывающая строки. Она получает строку от стандартного устройства ввода, которым является клавиатура. Поскольку строка не имеет заранее заданной длины, функция gets ( ) должна знать, когда ей прекратить работу. Функция читает символы до тех пор, пока ей не встретится символ новой строки (‘\n’), который создается при нажатии клавиши Enter. Функция берет все символы до ( но не включая ) символа новой строки, присоединяет к ним нуль–символ (‘\0’) и передает строку вызывающей программе. Если все идет хорошо, функция gets ( ) возвращает считанную строку. Если что-то неправильно или встретился символ EOF, то она возвращает символ NULL или нулевой адрес.
Рассмотрим пример считывания и вывода строки.
#include < stdio.h >
#include < string.h > /* Подключение файла string.h для работы со строками*/
main ( )
{ char name [ 20 ]; /*Выделение памяти*/
gets ( name ); /*Размещение введенной информации в строку name*/
printf ( “%s”, name); /*Вывод строки*/
}.
В приведенном примере для вывода строки использована функция printf ( ). Для вывода строк чаще всего используют функцию puts ( ). Разница между функциями состоит в том, что
printf ( ) не выводит автоматически каждую строку текста с новой строки. Если это потребуется, то нужно соответствующее указание. Так,
printf (“%s\n”, string);
дает то же самое, что и
puts ( string ) ;
Первый оператор требует ввода большого числа символов и большего времени при выполнении на компьютере. Рассмотрим пример.
#include < stdio.h >
#include < string.h >
main ( )
{ static char str1[ ] = “массив инициализирован”;
char *str2 = “Указатель инициализирован”;
puts ( str1 );
puts ( str2 );
puts ( &str1[4] );
puts ( str2+4);
}.
В результате работы получаем:
массив инициализирован
указатель инициализирован
ив инициализирован
атель инициализирован
Обратите внимание на два последних оператора. Указатель &str1[4] ссылается на пятый элемент массива str1. Этот элемент содержит символ ‘и’, и функция puts ( ) использует его в качестве начальной точки. Аналогично str2+4 ссылается на ячейку памяти, содержащую ‘а’, и с которой начинается вывод строки.
1.3. Функции над строками
В языке Си существует много функций работы над строками. Рассмотрим некоторые из них.
1.3.1. Функция strlen ( str ) вычисляет длину строки. Тип результата unsigned (беззнаковый) .
1.3.2. Функция strcat ( str1, str2 ) приписывает строку str2 к строке str1, и это объединение становится новой первой строкой. Функция strncat ( str1, str2, kol ) приписывает kol символов строки str2 к строке str1. Например,
main ( )
{ static char str1[ ] = “СТРОКА”;
char *str2 = “_СИМВОЛОВ”;
strcat ( str1, str2 );
puts ( str1);
strncat (str1, str2, 3);
puts ( str1);
}.
В результате работы программы получим:
СТРОКА_СИМВОЛОВ
СТРОКА_СИМ
1.3.3.Функция strcpy ( str1, str2 ) копирует строку str2 в строку str1.
Пример.
main ( )
{static char str1[ ]=”СТРОКА”;
char *str2=”СИМВОЛОВ”;
strcpy (str2,str1);
puts (str2);
strncpy (st1,st2,3);
puts (st1);
}.
В результате работы программы получим
СТРОКА
СИМОКА
При работе strcpy информация из str1 скопировалась в str2. Строка, куда копируется информация, должна быть не меньше той строки, из которой информация копируется. Функция strncpy скопировала 3 первых символа из строки st2 в строку st1. Но поскольку признак конца строки стоит после буквы А, будет получен приведенный выше результат. Если требуется закончить строку на трех скопированных символах, то необходимо после третьего символа ( по счету он будет вторым , т.к. отчёт начинается с нуля ) поставить признак конца строки. Для этого в программу перед последним puts требуется ввести оператор st1[3]=’\0’ ;
1.3.4. Функция strchr (str,c) находит в строке str первое вхождение символа, определяемое параметром С. Функция strrchr (str,c) находит в строке str, последнее вхождение символа, определяемое параметром С.
Пример,
main ( )
{static char st1[ ] = ”СТРОКА”;
char *ptr, c =’p’
ptr =strchr (st1,c);
if ( ptr )
printf(“%d”,ptr-st1);
else
printf (“нет символа”);
}.
В результате работы программы будет выведено число 2. Символ ‘р’ стоит на втором месте, т.к. отсчёт начинается с нуля.
Переменной С присвоено значение символа, который должен быть найден в строке. Указатель ptr после выполнения функции strchr получает либо значение адреса, где содержится искомый символ, либо его значением становится NULL, если символ не найден. Поскольку st1 является адресом первого символа строки, то ptr-st1 покажет местоположение символа в строке. Функция strrchr работает аналогично функции strchr.
1.3.5.Функция strpbrk(str1,str2) находит в строке str1 первое появление любого из множества символов, входящих в строку str2.
Пример,
main ( )
{ static char st1[ ]=”СТРОКА”;
char *ptr;
char *st2 = ”рок”;
ptr = strpbrk (st1,st2);
if (ptr)
printf (“%d”,ptr-st1);
else
printf (“нет символов”);
}.
Результатом работы программы будет число 2.Эта программа отличается от предыдущей лишь тем, что поиск ведётся, исходя из множества символов инициализированных в нашей программе с помощью указателя st2.
1.3.6. Функция strset (str,c) заменяет все символы строки str на значение, определяемое параметром С.
Функция strnset(str,c,kol) заменяет kol символов строки str на значение, определяемое параметром С.
Пример,
main ( )
{ static char st1[ ]=”СТРОКА”;
{ static char st2[ ]=”СИМВОЛ”;
char letter = ’x’;
strset (str1, letter);
puts (str1);
strnset (str2, letter,3);
puts (str2);
}.
В результате работы программы будет получено:
ХХХХХХ
ХХХВОЛ
1.3.7.Функция strcspn (st1,st2) определяет местоположение символа строки st1, который первым совпал с одним из символов строки st2.
Пример,
main ( )
{ static char str1[ ]=”СИМВОЛ”;
{ static char str2[ ]=”ВОЛ”;
int n;
n=strcspn (str1,str2);
printf (“%d”,n);
}.
В результате работы программы будет получено значение переменной n равное трём. Это произошло потому, что первым совпавшим символом в строках str1 и str2 является символ ‘B’ , а он стоит на третьем месте (отсчёт начинается с нуля).
Функция strspn (st1,st2) определяет местоположение символа строки st1 , который первым не совпал с одним из символов строки st2.
Пример,
main ( )
{ char *str1=”1234567890”;
char *str2=”123458”;
int n;
n=strspn (str1,str2);
printf (“%d”,n);
}.
В результате работы программы будет получено значение переменной n, равное пяти. Такой результат получен потому, что первым не совпавшим символом в строках str1 и str2 является символ ‘6’, а он стоит на пятом месте (отсчёт от нуля).
1.3.8. Функция strrev (str) меняет порядок следования символов на противоположный.
Приведём примеры с использованием расмотренных выше функции.
Пример 1.Подсчитать количество символов ‘a’ в строке.
main ( )
{char *str;
int n,k,i;
gets (str); /*ввод строки */
n = strlen (str); /* определение количества символов в строке*/
for (k=0, i=0; i
if (str[i]==’a’) k=k+1;
printf (“%d”,k); /*вывод количества символов*/
}.
Пример 2.Решить задачу из примера 8, применив указатель.
main ( )
{char *str;
gets (str);
while (*str!=’\0’); /*проверка на наличие конца строки*/
if (*str==’a’) k=k+1; /*подсчёт количества символов ‘а’*/
str++; /*смещение указателя на очередной символ*/
puts(str);
}.
Пример 3. В примере демонстрируется вывод разных частей строки.
main ( )
{static char st [ ] = “До встречи”;
char *ptr;
ptr = st;
puts ( str ); /* вывод строки*/
puts ( ++ptr ); /* смещение указателя на первый символ строки и вывод строки*/
st [ 7 ] = ‘ \0 ’; /* признак конца строки помещается на место седьмого символа строки */
puts ( st ); /* вывод получившейся строки */
puts ( ++ptr ); /* смещение указателя с первого символа нп второй и вывод строки*/
}.
В результате работы программы будет выведена следующая информация:
До встречи
о встречи
до_встр
_встр
Пример 4.
main ( )
{static char st [ ] = “ СТРОКА ”;
char *ptr;
ptr = st + strlen ( st ); /* установка указателя на конец строки*/
while ( -- ptr >-=st ) /* смещение указателя с первого символа на второй и вывод строки*/
puts ( ptr );
}.
Результат работы программы :
А
КА
ОКА
РОКА
ТРОКА
СТРОКА
Пример 5. Определить первый пробел в строке и вывести строку с этой позиции и до конца. Если нет ни одного пробела, то выдать об этом сообщение.
main ( )
{ char *st;
gets ( st ); /* ввод строки*/
while ( st! = ‘_’&&*st! = ‘\0’)
st++; /* останавливается на первом пробеле или нуль-символе*/
if ( st == ‘\0’)
printf ( “нет пробела”);
else
puts ( st );
}.
Литература
-
Подбельский В.В. Язык Cu ++: Учебное пособие. - М.: Финансы и статистика,1995, - 560 с.
-
Страуструп Б. Язык программирования Сг ++. - М.: Радио и связь, 1991. - 352 стр.
-
Собоцинский В.В. Практический курс Turbo Cu ++. Основы объктно- ориентированного программирования. - М.: Свет, 1993. - 236 с.
-
Романов В.Ю. Программирование на языке Cu ++. Практический подход. - М.: Компьтер, 1993. - 160 с.
-
Уинер Р. Язык турбо Cu . - М.: Мир, 1991. - 384 с.
-
Юлин В.А., Булатова И.Р. Приглашение к Cu. - Мн.: Высш. Шк., 1990,- 224 с.
-
Котлинская Г.П., Галиновский О.И. Программирование на языке Cu. -Мн.: Высш. Шк., 1991. - 156 с.
Достарыңызбен бөлісу: |