DEV Community

Amirshokh
Amirshokh

Posted on • Edited on

Язык программирования Си. Глава(Chapter) 11

  1. Символьные строковые литералы(Character String Literals) или строковые константы(String Constants) размещаются в статической памяти(Static Memory), имеют статический класс хранения(Static Storage Class) и действуют в качестве указателя на место, где хранится строка(обычно строка, заключенная в кавычки, хранится в сегменте данных, который является частью исполняемого файла; когда программа загружается в память, вместе с ней загружается и эта строка(стр. 423) ):
"Hello!" == ptrtoconstchar;
*("Wow!" + 3) == "Wow!"[3] == 3["Wow!"] == '!'
Enter fullscreen mode Exit fullscreen mode
  1. Массив элементов типа char с завершающим нулевым символом(null character) \0, является копией строкового литерала в статической памяти и объявляется(declaration) с или без инициализации: char str[] = "H" "i" "!";(конкатенация строк в ANSI C), char str[4] = "Hi!", char str[constvar];, char strvar или char string[] = {'H', 'i', '\0'};, но char array_of_chars[] = {'H', 'i'};(не строка) и автоматическое заполнение символом '\0' неинициализированных элементов массива

  2. Различия реализаций строк через массив и указатель

&str[0] = "Hi";
*ptrtoconst = 'H'; недопустимы
Enter fullscreen mode Exit fullscreen mode
  1. Ввод и вывод строк и создание пространства(массива 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() в строковую переменную)

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

  3. Функции обработки строк(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().

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

  5. Аргументы командной строки(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";

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

#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);
}
Enter fullscreen mode Exit fullscreen mode
#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;
}
Enter fullscreen mode Exit fullscreen mode
#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);
%>
Enter fullscreen mode Exit fullscreen mode
#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");
}
Enter fullscreen mode Exit fullscreen mode
#include <stdio.h>

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

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

Top comments (0)