DEV Community

Amirshokh
Amirshokh

Posted on • Edited on

1 1

Язык программирования Си. Глава(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

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay