Строковые константы, массивы символьных строк и их инициализация. Указатели и строки, ввод-вывод и обработка строк.

В языке C, в отличие от языка Pascal, отсутствует специальный строковый тип данных. Строка представляет собой последовательность (одномерный массив) из одного или более символов, последним из которых является нулевой символ таблицы ASCII ''. Это единственный вид строки, определенный в C.

 

Язык C поддерживает строковые константы, называемые строковыми литералами. Строковый литерал – это любая последовательность символов, заключенная в двойные кавычки ("…"). В конце литерала компилятор автоматически добавляет нулевой символ.

 

Не следует путать понятия строки и символа. Символьная константа заключается в одинарные кавычки, а строковая – в двойные.

 

Например, 'c' – символьная константа, а "c" – строковая константа.

 

Литерал можно задать с помощью директивы препроцессора define:

 

# define STR "…"

 

Строковая переменная может быть сформирована как одномерный массив типа char либо с помощью указателя на переменную типа char. Количество символов в массиве (объем выделяемой памяти) должно быть не меньше, чем количество символов в строке плюс один символ для хранения символа нуль.

 

К началу главы

11.1. Представление символьной строки при помощи одномерного массива

 

Синтаксис объявления имеет вид:

 

char ID [N];

 

где ID – идентификатор массива, N – длина массива, при этом в памяти для хранения строки выделяется N байт.

 

Например, для переменной char ST[10] в памяти выделяется 10 байт, что дает возможность сформировать строку из 9 символов. Для таких строк действуют все правила представления и обработки массивов.

 

Идентификатор массива – константа типа указатель, значение которой равно адресу первого элемента массива.

 

Инициализация возможна двумя способами:

 

· посимвольная инициализация char st[10]={'y','e','s',''};

 

при этом оставшиеся 6 позиций не будут заполнены;

 

· инициализация на основе строковой константы char st [10]="Yes";

 

при этом в выделенную для строки память будут помещены 3 символа и добавлен четвертый – символ ''.

 

Инициализация и объявление возможны без указания длины массива char st[]={'y','e','s',''};

 

в этом случае будет создан массив из четырех элементов.

 

К началу главы

11.2. Указатель на символьную строку

 

По форме записи данная конструкция ничем не отличается от указателя на символьную переменную: char *S1;

 

где char – тип указателя на символ, S1 – переменная-указатель.

 

Для инициализации указателя требуется указать область памяти, где уже находится или будет находиться строка, при этом для строки должен быть выделен необходимый объем памяти.

 

Существует ряд способов инициализации указателя на строку:

 

· инициализация строковым литералом char *S1="Yes";

 

· присваивание значение другого указателя char *S1=S;

 

где S – идентификатор массива или указатель на другую строку символов.

 

Указателю можно присваивать значение другого указателя: S1=S;

 

где S1 – переменная типа указатель; S – строковая константа, идентификатор массива или указатель на другую строку символов.

 

Например, char *S1, S[10]="Yes"; S1=S;

 

При этом создаются переменная-указатель S1 и массив символов S, под который выделяется поле длиной 10 символов, 4 из которых будут заполнены. Затем в переменную-указатель записывается адрес символьного массива (рис. 11.1).

 

Рис. 11.1. Строковая константа и указатель

 

К началу главы

11.3. Ввод/вывод символьных строк

 

Ввод символьных строк с клавиатуры в языке C осуществляется с помощью функций scanf() и gets(), объявленных в заголовочном файле stdio.h. При работе с этими функциями следует помнить, что для строк предварительно должна быть выделена память. Конечный нуль добавляется после завершения ввода строки автоматически.

 

Существует несколько способов ввода строк:

 

· scanf ("%s",S1); где S1 – указатель типа char* на предварительно выделенную область. При использовании формата %s аргумент рассматривается как строка. Ввод строки реализуется до пробела или нажатия [Enter]. Несколько слов вводить в одну переменную с помощью scanf нельзя;

 

· scanf ("%Ns",S1); где N – максимальное число символов, записываемых в строку S1. Заполнение строки заканчивается при вводе N непробельных символов или выполняется до первого пробельного символа.

 

· gets (S1); при помощи этой функции можно вводить строку, содержащую пробелы. Ввод прекращается при нажатии [Enter] или при заполнении буфера клавиатуры.

 

Вывод символьных строк на экран в C осуществляется с помощью функций printf() и puts():

 

· printf("%s",S1); где S1 – указатель типа char*

 

· puts (S1);

 

Вывод строки продолжается до символа '/0'.

 

Пример 1. Что напечатает ЭВМ?

 

#include <stdio.h>

 

#define STR "What is your name?"

 

int main()

 

{

 

char *ch;

 

static char ch1[]="My name is Georgen";

 

ch=STR;

 

printf("n%s t %s",ch,ch1);

 

/*t – табуляция – сдвиг на заданное количество позиций*/

 

for (int i=0;i<6;i++)

 

{

 

printf("n %c", *(ch+i));

 

printf(" %c", *(ch1+i));

 

}

 

return 0;

 

}

 

На экране будут выведены строки:

 

What is your name? My name is George

W

M

 

h

y

 

a

 

 

t

n

 

 

a

 

i

m

 

 

Пример 2. Задан указатель на символьную строку. Подсчитать, сколько раз в строке встретится буква 'а':

 

# include <stdio.h>

 

int main()

 

{

 

int k;

 

char *S2="Ivanov is an engineer";

 

for (k=0; (*S2)!= ''; S2++)

 

if ((*S2)=='a'||(*S2)=='A') k++;

 

printf("n number of 'a' is %d",k);

 

return 0;

 

}

 

После завершения работы цикла указатель S2 указывает на конец строки, и доступ к этой строке теряется.