Язык программирования Си. Глава(Chapter) 11
Tags: c, russian
Published: 2022-06-24 17:56:32

1. Символьные строковые литералы(_Character String Literals_) или строковые константы(_String Constants_) размещаются в статической памяти(_Static Memory_), имеют статический класс хранения(_Static Storage Class_) и действуют в качестве указателя на место, где хранится строка(обычно строка, заключенная в кавычки, хранится в сегменте данных, который является частью исполняемого файла; когда программа загружается в память, вместе с ней загружается и эта строка(стр. 423) ): 
```c
"Hello!" == ptrtoconstchar;
*("Wow!" + 3) == "Wow!"[3] == 3["Wow!"] == '!'
```

2. Массив элементов типа `char` с завершающим нулевым символом(`null character`) `\0`, является копией строкового литерала в статической памяти и объявляется(declaration) с или без инициализации: char str[] = "H" "i" "!";(конкатенация строк в ANSI C), char str[4] = "Hi!", char str[constvar];, char str[var](начиная с C99) или char string[] = {'H', 'i', '\0'};, но char array_of_chars[] = {'H', 'i'};(не строка) и автоматическое заполнение символом '\0' неинициализированных элементов массива

3. Различия реализаций строк через массив и указатель
```c
&str[0] = "Hi";
*ptrtoconst = 'H'; недопустимы
```
4. Ввод и вывод строк и создание пространства(массива char) под строку: в `stdio.h` функции `scanf()`(возвращает количество успешно введённых элементов) и `printf()`, небезопасный `gets()`(считывает строку до символа '\n' и может вызвать переполнение буфера(_Buffer Overflow_), может перезаписать данные в других ячейках или вызвать ошибку сегментации(_Segmentation Fault_)) или безопасная альтернатива `gets_s()`(отбрасывает лишние символы) в C11(необязательное расширение в стандарте) и `puts()`, `fgets()`(принимает также длину считываемой строки из буфера) из `stdin`(standard input) и `fputs()` в `stdout`(standard output), также `sprintf()`(`printf()` в строковую переменную)

5. Различие в типе но не в значении(оба равны 0) нулевого указателя(null pointer) — `NULL`(адрес типа typename * занимает 4 байта) и нулевого символа(null character) — '\0'(символ типа char(повышается до int) занимает 1 байт)

6. Функции обработки строк(_String-handling Functions_) в `string.h` в ANSI C(strings.h в других системах): `strlen()`, небезопасная `strcat()`(string concatenation), `strncat()`, strcmp()(string comparison), `strncmp()`, небезопасная `strcpy()` и `strncpy()`(копирует исходную строку(source) в цель(target)), `strchr()`, `strpbrk()`, `strrchr()`, `strstr()`.

7. Функции преобразования строк в числа(_String-to-Number Conversions_) в `stdlib.h`: `atoi()`(alphanumeric to integer), atof(), `atol()`, гибкие(при смешанном вводе) `strtol()`, `strtoul()`, `strtod()`, также `itoa()` и `ftoa()`(не являются частью стандартной библиотеки и лучше заменить на `sprintf()`)

8. Аргументы командной строки(_Command-line Arguments_): `int argc`(argument count) и `char **argv`(argument values), где обычно в argv[0] находится имя программы. Если в терминале ($ или >) main.exe "I am" 19, то argc == 3; argv[0] == "main.exe"; argv[1] = "I am"; argv[2] == "19";

9. Алгоритм сортировки выбором(_The Selection Sort Algorithm_) и в частности сортировка указателей вместо строк

```c
#include <stdio.h>

int main(void)
{
    int arr[3][3] = { 0, [0][1] = 1, [1] = 10, [2] = 20, 30 };
    int (* ptr)[3] = arr;
    int * ptr1[] = { ptr[1], &(* (ptr + 2))[0], (* (ptr + 2) + 1) };
    int ** ptr2[] = { [5] = ptr1 };
    int a = **(* (ptr2 + 5) + 1);
    printf("a = %d", a);
}
```

```c
#include <stdio.h>

int main(void)
{
    int arr1[0];
    int * ptr1 = arr1;
    
    int arr2[0] = { 12 };
    int * ptr2 = arr2;
    
    if (ptr1 == ptr2)
        printf("Statement is true.");
    else
        printf("Statement is false.");
    return 0;
}
```

```c
#include "stdio.h"

void main(void)
<%
    #define str1 "Side A"
    char side_a<::> = str1;

    char notstr<::> = <%'H', 'E', 'L', 'L', 'O', '!'%>;

    #define str2 "Side B"
    char side_b<::> = str2;
    
    return (void)printf("%s", notstr + 4);
%>
```

```c
#include <stdio.h>
#define str "Hello"

int main(void)
{
    const char * ptr = "Hello";
    if (str == ptr)
        printf("Statement is true");
    else
        printf("Statement is false");
}
```

```c
#include <stdio.h>

int main(void)
{
    long long arr[5] = {1, 2, 3, 4, 5};
    printf("%d", sizeof (4)[arr]);
    return 0;
}
```

> Язык программирования Си 6 издание. Стивен Прата
> C Primer Plus 6th edition. Stephen Prata