Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_3.doc
Скачиваний:
0
Добавлен:
14.11.2019
Размер:
297.98 Кб
Скачать

Строки, массивы символов и указатели char*

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

  • указатель на отдельный байт;

  • указатель на область памяти - массив байтов;

  • указатель на отдельный символ;

  • указатель на массив символов.

Какая из перечисленных интерпретаций в действительности имеет место - зависит от программы, транслятор здесь не накладывает ограничений.

Тем не менее, по сложившейся традиции будем считать, что указатель на char ссылается на массив символов. А поскольку стандартным содержимым массива символов является строка - последовательность символов, ограниченная символом кодом 0, то такой указатель логично назвать указателем на строку. Использование его в программе, при работе со строками, предпочтительнее по сравнению с массивом символов, потому что размерность массива символов фиксирована, а размерность памяти, адресуемой указателем, ограничивается внешними факторами. Таким образом, он является более естественным средством для представления строки.

Int strlen(char *s) // Возвращает длину строки,

{ // заданной указателем на

Int n; // на строку char*

for (n=0; *s != '\0'; s++);

return(n);

}

void strcat(char *s1, char *s2)

{ // объединяет строки,

while (*s1 !='\0') s1++; // заданные указателями

for (; *s2 !='\0'; *s1++ = *s2++);

*s1 = '\0';

}

Строковая константа представляет собой последовательность символов, заключенных в двойные кавычки (например "abcd"). Для строковой константы транслятор в любом контексте программы выполняет следующие действия:

  • создает массив символов с размерностью, достаточной для размещения строки;

  • инициализирует (заполняет) массив символами строки, дополняя символом '\0';

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

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

С точки зрения такого определения корректны и такие выражения:

char c,*q;

c = "ABCD"[3];

q = "12345" + 2;

for (q = "12345"; *q !='\0'; q++);

Таким образом, имя массива символов, строковая константа и указатель на строку на самом деле имеют в языке один и тот же тип char*, поэтому могут использоваться в одном и том же контексте, например, в качестве фактических параметров функций:

extern int strcmp(char *, char*);

char *p, A[20];

...

strcmp(A, "1234");

strcmp(p, A+2);

С/С++ имеет много функций работы со строками, их прототипы определены в string.h

1.4 Задание к лабораторной работе

В Borland C++ Builder создать проект “Работа с массивом строк”, в котором с помощью функций обеспечить реализацию следующих действий:

  1. Задачи обработки строки:

    • удаление начальных пробелов в строке;

    • удаление хвостовых пробелов в строке;

    • форматирование строки;

    • создание динамического массива слов.

  2. Задачи на выборочную обработку строки:

    • поиск максимального слова (по длине);

    • поиск минимального слова (по длине).

  3. Задачи на перестановку слов в строке:

    • поменять местами наибольшее и наименьшее слово в строке;

    • инвертировать каждое слово в строке, не меняя его места;

    • инвертировать слова, первое слово меняется местом с последним, второе с предпоследним и т.д.

  4. Задачи на сортировку слов:

    • по буквам в каждом слове;

    • по длинам слов;

Реализацию интерфейса обеспечить с помощью стандартных компонент Borland C++ Builder, таких как Edit, SpinEdit, Button, MainMenu, Memo, и т.п.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]