🎏15. Строки. Строковой и символьный литералы. Представление в памяти.
Примеры различных способов инициализации строк. Основные функции библиотеки <string.h> и их реализация.
Строки. Строковой и символьный литералы.
В языке C (Си) нет отдельного типа для строк, но в программе строки могут определяться как массивы символов (массив элементов типа char) или строковые константы.
Как и массив, это непрерывный участок памяти, объединенный единым именем.
Строковый литерал " " – это последовательность символов в двойных кавычках (строковая константа) или массив символов, заканчивающийся терминальным нулем \0.
Символьный литерал ' ' – один символ в одинарных кавычках.

Выделение памяти и инициализация
Статическое выделение:
char string[41];
- создан массив из 41 символа типа char
char string[] = "Горные вершины спят во тьме ночной.";
Динамическое выделение:
char *str = “Hello”
Основные функции и их реализация:
На экзамене обязательно указать реализацию strcpy, strlen +strcat
strtok
- aнaлог функции split
в Python
unsigned int strlen (const char *s) // вычисляет длину строки
{
unsigned int i;
for (i = 0; *(s + i) != 0; i++);
return i;
}
char* strcpy(char *s1, const char* s2) // копирует строку
{
unsigned int i;
for (i = 0; (*(s1 + i) = *(s2 + i)); i++);
return s1;
}
char *strcat(char *s1, const char *s2) // "склеивает" строки
{
char *p;
unsigned int i;
for (p = s1; *p; p++);
for (i = 0; p[i] = s2[i]; i++);
return p;
}
int strcmp(const char* s1, const char *s2) // сравнивает строки. 0 - строки одинаковы,\
1 - в первой строке первый отличающийся символ больше, чем во второй,\
-1 - в первой строке первый отличающийся символ меньше, чем во второй.
{
unsigned int i;
for (i = 0; *(s1 + i) && (*(s1 + i) == *(s2 + i)); i++);
return *(s1 + i) - *(s2 - i);
}
const char* strchr(const char* s, char ch) // возвращает указатель на первый символ ch в строке
{
const char *p;
for (p = s; *p && *p != ch; p++);
return p;
}
char* strstr(const char* s, const char* sub_s) // возвращает указатель на начало подстроки
{
int key = 0;
char* p;
for (p = s; !key && *p;) {
unsigned i;
for (i = 0; *(sub_s + i) && (*(p + i) == *(sub_s + i)); i++);
if (!*(sub_s + i))
key = 1;
else
p++;
}
return key ? p : NULL;
}
char* strpbrk(const char* s, const char* sym) // возвращает указатель на любой символ из sym,\
который первый встретился
{
int key = 0;
char* p;
for (p = s; !key && *p;) {
unsigned i;
for (i = 0; *(sym + i) && (*p != *(sym + i)); i++);
if (*(sym + i))
key = 1;
else
p++;
}
return key ? p : NULL;
}
Last updated