- •Министерство образования и науки Российской Федерации
- •1. Модель рабочего стола
- •2. Интерфейс командной строки
- •3. Компиляция, компоновка и выполнение программы
- •4. Командные файлы
- •5. Вывод символьной информации
- •6. Операции с целыми числами
- •7. Операции с вещественными числами
- •8. Операторы
- •9. Символы и строки
- •10 Передача параметров в командной строке
- •Министерство образования и науки Российской Федерации
- •Министерство образования и науки Российской Федерации
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> на вход поступает последовательность слов, содержащихся в текством файле, программа подсчитывет, количество слов;