- Символьные строковые литералы(Character String Literals) или строковые константы(String Constants) размещаются в статической памяти(Static Memory), имеют статический класс хранения(Static Storage Class) и действуют в качестве указателя на место, где хранится строка(обычно строка, заключенная в кавычки, хранится в сегменте данных, который является частью исполняемого файла; когда программа загружается в память, вместе с ней загружается и эта строка(стр. 423) ):
"Hello!" == ptrtoconstchar;
*("Wow!" + 3) == "Wow!"[3] == 3["Wow!"] == '!'
Массив элементов типа
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' неинициализированных элементов массиваРазличия реализаций строк через массив и указатель
&str[0] = "Hi";
*ptrtoconst = 'H'; недопустимы
Ввод и вывод строк и создание пространства(массива 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()
в строковую переменную)Различие в типе но не в значении(оба равны 0) нулевого указателя(null pointer) —
NULL
(адрес типа typename * занимает 4 байта) и нулевого символа(null character) — '\0'(символ типа char(повышается до int) занимает 1 байт)Функции обработки строк(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()
.Функции преобразования строк в числа(String-to-Number Conversions) в
stdlib.h
:atoi()
(alphanumeric to integer), atof(),atol()
, гибкие(при смешанном вводе)strtol()
,strtoul()
,strtod()
, такжеitoa()
иftoa()
(не являются частью стандартной библиотеки и лучше заменить наsprintf()
)Аргументы командной строки(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";Алгоритм сортировки выбором(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);
}
#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;
}
#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);
%>
#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");
}
#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
Top comments (0)