Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УЧЕБНАЯ ПРАКТИКА120625.doc
Скачиваний:
2
Добавлен:
27.09.2019
Размер:
526.85 Кб
Скачать

9. Символы и строки

Символьные константы в языке С относятся к типу char (character - буква). Их можно представлять как в виде числовых значений ASCII-кода, так и в виде соответствующих символов, в исходном тексте программы эти символы следует заключать в апострофы (одинарные кавычки). Для вывода символьной константы в виде символа используют спецификацию формата %с.

/*prog15.c*/

#include<stdio.h>

main()

{

char x = ‘A’, y = 97;

printf (“Численное значение переменной х равно %d, в ней хранится символ %c \n Численное значение переменной у равно %d, в ней хранится символ %с \n”, x, x, y, y);

return 0;

}

Откомпилировав и выполнив программу мы увидим, что буква ‘А’ имеет ASCII-код 65, а ASCII-коду 97 соответствует строчная буква ‘а’.

Таким образом, мы можем присваивать целочисленные значения переменным типов int и char, выполнять с ними обычные арифметические действия, представлять в десятичной системе счисления. Однако переменные этих типов занимают разный объем памяти. Операция

sizeof (имя_переменной)

определяет количество байтов, которые операционная система выделила указанной переменной.

/*prog16.c*/

#include<stdio.h>

main()

{

int x = 97;

char y = 97;

printf (“Переменной х типа int присвоено значение %d, она занимает %d байт Переменной у типа char присвоено значение %d, она занимает %d байт ”, x, sizeof(x), y, sizeof(y));

return 0;

}

При вызове функции printf вычисляются значения всех её аргументов - x, sizeof(x), y, sizeof(y) – эти значения операционная система выводит на экран.

Строка в языке С представляет собой массив, образованный следующими друг за другом переменными типа char. Они нумеруются целыми числами (индексами массива), начиная с нуля. Спецификация формата ввода-вывода строки - %s. Строка не обязательно должна занимать весь массив – ее конец отмечает элемент с нулевым значением.

/*prog17.c*/

#include<stdio.h>

main()

{

char str[20] = “I am a student”;

str[6] = 0;

printf( “%s\n”, str );

return 0;

}

Прежде всего, обратим внимание на объявление массива str. Сначала идёт имя типа элемента массива – char, затем имя массива – str и модификатор типа – квадратные скобки. В языке С квадратные скобки интерпретируются как операция доступа к элементу массива: str[6] = 0 – элементу массива str с индексом 6 присвоить значение 0. Объявление массива следует понимать так: выполнив с переменной str операцию доступа к элементу массива, мы получим значение типа char. Число в квадратных скобках при объявлении массива равно количеству его элементов; так как индекс начального элемента 0, то индекс последнего элемента массива равен 19. В строке “I am a student” 11 букв и три пробела – всего 14 символов, да еще символ с нулевым значением, завершающий строку – получается, что длина строки составляет 15 символов, последний байт массива не используется. В теле функции элементу с индексом 6 присваивается значение 0, следовательно, строка сокращается. Откомпилировав и выполнив программу prog16.c, мы увидим, что она выводит на экран лишь 6 символов строки: “I am a”.

Есть еще один способов объявления массива. На самом деле в переменной str хранится адрес начального элемента массива, т.е. str – это ссылка на переменную str[0].

Значение адреса можно получить с помощью операции разадресации, она обозначается символом *.

/*prog18.c*/

#include<stdio.h>

main()

{

char *str = “I am a student”;

str[7]=‘S’;

printf(“%s \n”, str);

return 0;

}

После выполнения программы на экране появляется сообщение “I am a Student”. Таким образом, объявления

char str[20];

char *str;

можно считать равноправными. На самом деле это не так – в первом случае мы точно знаем, что нам выделено место в памяти для размещения двенадцати элементов, во втором дело обстоит гораздо сложнее.

В программах prog17.c и prog18.c мы присваивали строке значение при помощи инициализации, а затем изменяли ее отдельные символы. Использовать операцию = для изменения самой строки в теле функции нельзя, это делает специальная библиотечная функция. Зато при вводе строки не надо выполнять операцию ссылки:

scanf(“%s”, str);

/*prog19.c*/

/* Программа выводит на экран строку (без пробелов), которую ввёл пользователь */

#include <stdio.h>

#define N 1000

main()

{

char str[ N ];

scanf ( “%s”, str);

printf(“%s \n”, str);

return 0;

}

Переменная str в программе prog19 является буфером – областью памяти для временного хранения введённой информации. Обычно объём требуемой памяти для буфера известен лишь приблизительно, поэтому его выделяют с некоторым запасом. Числовые значения, которые используются в программе, следует задавать с помощью директивы препроцессору define, в этом случае уменьшается вероятность ошибок в случае их изменения.

/*prog20.c*/

/* Программа подсчитывает количество символов в строке (без пробелов), которую ввёл пользователь */

#include<stdio.h>

#define N 1000

main()

{

char c, str[ N ]; /* в массиве str будет храниться строка, которую введёт пользователь, прочитанный символ строки программа будет помещать в ячейку c */

unsigned int i; /* переменная i будет индексом символа строки */

scanf ( “%s”, str);

i = 0;

c = str[ i ]; /*начальный символ строки помещается в ячейку c*/

while ( c != 0 )

{

i++;

c = str [ i ];

}

/*после выхода из цикла значение переменной i будет равно индексу последнего элемента строки, значение этого элемента равно нулю; индекс начального элемента строки равен нулю, следовательно, значение переменной i после завершения цикла будет совпадать с количествомтех символов, которые ввёл пользователь*/

printf(“%u \n”, i );

return 0;

}

Задания

Составьте программы, для решения следующих задач:

<9.1> составьте программу, подсчитывающую количество символов в строке, которую ввёл пользователь (аналогичную программе prog20.c), причём вместо оператора цикла while используйте оператор цикла for;

<9.2> на вход поступают строка (без пробелов) программа выводит символы строки в обратном порядке;

<9.3> на вход поступают строка (без пробелов), программа выводит символы строки ‘в столбик’;

<9.4> на вход поступают строка (без пробелов), программа выводит символы строки, разделённые пробелами, например:

пользователь вводит: aabbc,

на экране появляется: a a b b c;

<9.5> на вход поступают строка (без пробелов) и символ, программа выводит на экран символы строки ‘лесенкой’, например:

пользователь вводит: aabbc,

на экране появляется:

a

a

b

b

c;

<9.6> на вход поступают строка (без пробелов) и символ, программа подсчитывет, сколько раз символ встречается в строке;

<9.7> на вход поступают строка (без пробелов) и два символа, программа определяет, какой из них встречается в строке чаще;

<9.8> на вход поступает последовательность слов, содержащихся в текством файле, программа подсчитывет, количество слов;