🎏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