Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции за I семестр 2014 - суммарный текст / Лекции за I семестр 2014 - суммарный текст.doc
Скачиваний:
209
Добавлен:
17.03.2016
Размер:
1.36 Mб
Скачать

12.1. Строки как нуль-терминированные массивы char.

а) Основные понятия.

Один из способов организовать работу со строками - это использование одномерных массивов типа char. Тогда строка символов – это одномерный массив типа char, заканчивающийся нулевым байтом.

Нулевой байт – это байт, каждый бит которого равен нулю, при этом для нулевого байта определена символьная константа ´\0´ (признак окончания строки, или нуль-терминатор). По нулевому байту функции, работающие со строками, определяют место окончания строки. Если они читают строку, то воспринимают ее только до первого нуль-терминатора; если они создают строку, то записывают нуль-терминатор в ее конец.

Поэтому, если строка должна содержать максимум k символов, то в описании массива необходимо указать k+1 элемент. Например, char a[7]; - означает, что строка может содержать от 0 до 6 символов, а один байт будет занимать нуль-терминатор.

Строковая константа – это набор символов, заключенных в двойные кавычки, например: "Работа со строками". Такие константы хранятся именно как массивы типа char. В конце строковой константы явно указывать символ ´\0´ не нужно (он будет добавлен автоматически в ходе компиляции).

Строковые константы можно использовать при инициализации массивов:

сhar S[]="Работа со строками";

В этом примере размер массива не указан, поэтому он будет определен автоматически (19 элементов).

б) Ввод-вывод строк - массивов char.

Для ввода с консоли строк - массивов char обычно используются две стандартные функции:

scanf() (см. тему "Функции ввода-вывода"; спецификатор ввода %s; символ «&» перед именем массива типа char указывать не надо). Значения вводятся до появления первого символа “пробел”, а если его нет - до конца строки;

gets(char *S) (запись "char *S" означает, что на ее место нужно подставить массив типа char; можно также подставить указатель на char - см. тему "Указатели"). Значения вводятся до конца вводимой строки (т.е., в отличие от scanf(), может вводить строку с пробелами как единое целое).

Обе функции автоматически ставят в конец строки нулевой байт.

Вывод строк производится функциями printf() или puts() до первого нулевого байта (‘\0’):

printf() (см. тему "Функции ввода-вывода"; спецификатор вывода %s) не переводит курсор после вывода на начало новой строки;

puts(char *S) автоматически переводит курсор после вывода строковой информации в начало новой строки.

Например:

char Str[30];

printf("Введите строку без пробелов : \n");

scanf("%s",Str);

или

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

gets(Str);

В оконных приложениях C++ Builder изображаемый на экране текст, как правило, имеет тип String (или при необходимости автоматически преобразуется в String). Для вывода туда строки - массива char обычно достаточно просто подставить ее имя в функцию вывода:

Edit1->Text=Str;

Но для ввода оттуда такой строки необходимо использовать преобразование типов и копирование (объяснение см. ниже):

strcpy(Str, Edit1->Text.c_str());

в) Поэлементная работа со строками.

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

Пример поэлементной работы со строкой - массивом char :

Задача 1. В строке заменить все пробелы на символы подчеркивания.

#include<stdio.h>

#include<conio.h>