Строки, массивы символов и указатели 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 создать проект “Работа с массивом строк”, в котором с помощью функций обеспечить реализацию следующих действий:
Задачи обработки строки:
удаление начальных пробелов в строке;
удаление хвостовых пробелов в строке;
форматирование строки;
создание динамического массива слов.
Задачи на выборочную обработку строки:
поиск максимального слова (по длине);
поиск минимального слова (по длине).
Задачи на перестановку слов в строке:
поменять местами наибольшее и наименьшее слово в строке;
инвертировать каждое слово в строке, не меняя его места;
инвертировать слова, первое слово меняется местом с последним, второе с предпоследним и т.д.
Задачи на сортировку слов:
по буквам в каждом слове;
по длинам слов;
Реализацию интерфейса обеспечить с помощью стандартных компонент Borland C++ Builder, таких как Edit, SpinEdit, Button, MainMenu, Memo, и т.п.