Оглавление
stdlib.h #
Из строки в число #
atof #
double atof(const char* str)
- Конвертирует строку c float-числом в число и возвращает его
- Пропускает пробельные символы перед числом
- Останавливается после достижения символа, которого не должно быть в числе
- Поддерживает научный тип числа с экспонентой
e
илиE
atof("3.14"); // == 3.14
atof("2e3"); // == 2000
atoi, atol, atoll #
int atoi(const char* str)
long atol(const char* str)
long long atoll(const char* str)
- Конвертирует строку c целым числом в число и возвращает его
- Пропускает пробельные символы перед числом
- Останавливается после достижения символа, которого не должно быть в числе
atoi("-12345"); // == -12345
atoi(" 6789abc"); // == 6789
strtof, strtod #
float strtof(const char* str, char** endptr)
double strtod(const char* str, char** endptr)
- Конвертирует строку c float-числом в число и возвращает его
- Пропускает пробельные символы перед числом
- Останавливается после достижения символа, которого не должно быть в числе
- Поддерживает научный тип числа с экспонентой
e
илиE
- Если передать
endptr
отличным отNULL
- в него запишется указатель на первый символ после числа
strtof("3.14", NULL); // == 3.14
const char* str = "123.456abcd";
char* p = NULL;
float v = strtof(str, &p);
// v == 123.456
// p == "abcd"
strtol, strtoll, strtoul, strtoull #
long strtol(const char* str, char** endptr, int base)
unsigned long strtoul(const char* str, char** endptr, int base)
long long strtoll(const char* str, char** endptr, int base)
unsigned long long strtoull(const char* str, char** endptr, int base)
- Конвертирует строку
str
c целым числом по основаниюbase
(2.. 36) в число и возвращает его - Пропускает пробельные символы перед числом
- Останавливается после достижения символа, которого не должно быть в числе
- Если передать
endptr
отличным отNULL
- в него запишется указатель на первый символ после числа
strtol("101", NULL, 2); // == 5
strtol("1234 abc", NULL, 10); // == 1234
strtol("ff", NULL, 16); // == 255
const char* str = "12345abcd";
char* p = NULL;
int v = strtol(str, &p, 10);
// v == 12345
// p == "abcd"
Нестандартные #
Из числа в строку #
itoa, utoa, ltoa, ultoa #
char* itoa(int value, char* str, int base)
char* utoa(unsigned value, char* str, int base)
char* ltoa(long value, char* str, int base)
char* ultoa(unsigned long value, char* str, int base)
"Напечатает" целое число
value
по основанию base
(2.. 36) в буфер str
и добавит в конце нулевой символ. Вернёт str
:
- Для основания
10
выводится знак минус-
- Массив должен вместить нужное количество символов
char str[10];
itoa(-1234, str, 10); // "-1234"
itoa(-1234, str, 16); // "fb2e"
dtostrf #
char* dtostrf(double value, int width, int prec, char *str)
"Напечатает" число с плавающей точкой
value
с количеством цифр после разделителя prec
и минимальной длиной строки width
в буфер str
, добавит в конце нулевой символ. Вернёт str
:
- Можно просто передавать
width
, равнойprec + 2
dtostrf(3.1415, 1 + 2, 1, str); // "3.1"
dtostrf(3.1415, 4 + 2, 4, str); // "3.1415"
string.h #
Изменение #
strcpy #
char* strcpy(char* dest, const char* src)
Копирует строку
src
в строку dest
, включая нулевой символ. Не рекомендуется пересечение памяти, т.е. копирование туда же, откуда идёт чтение. Вернёт dest
.
char buf[20];
strcpy(buf, "hello"); // buf == "hello"
strcpy(buf + 5, "_world"); // buf == "hello_world"
strncpy #
char* strncpy(char* dest, const char* src, size_t num)
Копирует первые
num
символов строки src
в строку dest
. Нулевой символ включается в счёт num
. Если строка src
короче, чем num
, буфер dest
будет заполнен нулями до этой длины. Если src
длиннее, чем num
, то нулевой символ добавлен не будет - dest
может не являться валидной строкой после операции. Не рекомендуется пересечение памяти, т.е. копирование туда же, откуда идёт чтение. Вернёт dest
.
char buf[10] = "01234567";
strncpy(buf, "hello", 5); // buf == "hello567"
strncpy(buf, "hello", 6); // buf == "hello"
Рекомендуется передавать в функцию значение num
на единицу меньше размера буфера, а также самостоятельно устанавливать последний байт в 0:
const bufsize = 10;
char buf[bufsize];
strncpy(buf, "input", bufsize - 1);
buf[bufsize - 1] = 0;
strcat #
char* strcat(char * dest, const char* src)
Копирует строку
src
в конец строки dest
, заменяя её нулевой символ своим первым символом. dest
завершается нулевым символом. Вернёт dest
.
char buf[20] = "hello ";
strcat(buf, "world"); // buf == "hello world"
strncat #
char * strncat(char* dest, const char* src, size_t num)
Копирует первые
num
символов из строки src
в строку dest
, завершает нулевым символом. Вернёт dest
.
char buf[20] = "hello ";
strncat(buf, "world", 2); // buf == "hello wo"
Прочее #
strlen #
size_t strlen(const char* str)
Считает длину строки до нулевого символа, не включая его
strlen("hello"); // == 5
strlen(""); // == 0
strdup #
char* strdup(const char* src)
Нестандартная функция. Дублирует строку
src
в динамической памяти вместе с нулевым символом (по сути вызывает malloc и strcpy) и возвращает указатель на неё.
char* str = strdup("hello");
// str == "hello" == char[6]
free(str); // не забываем освободить память
Сравнение #
strcmp #
int strcmp(const char* str1, const char* str2)
Сравнивает две строки, возвращает:
0
- строки совпадают< 0
- первый несовпадающий символ вstr1
имеет меньшее значение, чем вstr2
> 0
- первый несовпадающий символ вstr1
имеет большее значение, чем вstr2
char str[] = "abc";
strcmp("abc", str); // 0
strcmp("abc", "abcd"); // -1
strncmp #
int strncmp(const char* str1, const char* str2, size_t num)
Сравнивает первые
num
символов двух строк, возвращает:
0
- строки совпадают< 0
- первый несовпадающий символ вstr1
имеет меньшее значение, чем вstr2
> 0
- первый несовпадающий символ вstr1
имеет большее значение, чем вstr2
strncmp("hello", "hello123", 5); // == 0
strncmp("hello456", "hello123", 6); // == 3
Поиск #
strchr, strrchr #
char* strchr(char* str, int c)
const char* strchr(const char* str, int c)
char* strrchr(char* str, int c)
const char* strrchr(const char* str, int c)
Ищет символ
c
в строке str
и возвращает указатель на него (это может быть нулевой символ с целью поиска указателя на конец строки). strchr
ищет с начала строки, strrchr
- с конца. Возвращает нулевой указатель, если искомого символа нет:
char buf[20] = "hello world";
char* p = strchr(buf, 'w');
// *p == 'w'
// (p - buf) == 6
// p == "world"
p = strchr(buf, 'x');
// p == 0
strstr #
char* strstr(char* str, const char* sub)
const char* strstr(const char* str, const char* sub)
Ищет подстроку
sub
в строке str
и возвращает указатель на её начало, либо нулевой указатель, если подстрока не найдена.
char buf[20] = "hello world";
char* p = strstr(buf, "world");
// p == "world"
// (p - buf) == 6
strspn #
size_t strspn(const char* str1, const char* str2)
Возвращает длину начального участка строки
str1
, который состоит только из символов строки str2
.
char buf[20] = "hello world";
strspn(buf, "he"); // == 2
strspn(buf, "helo"); // == 5
strspn(buf, "w"); // == 0
strcspn #
size_t strcspn(const char* str1, const char* str2)
Выполняет поиск первого вхождения в строку
str1
любого из символов строки str2
и возвращает количество символов до найденного вхождения.
char buf[20] = "hello world";
strcspn(buf, "w"); // == 6
strcspn(buf, "wl"); // == 2
strpbrk #
char* strpbrk(char* str1, const char* str2 );
const char* strpbrk(const char* str1, const char* str2)
Выполняет поиск первого вхождения в строку
str1
любого из символов строки str2
и возвращает указатель на найденный символ.
char buf[20] = "hello world";
char* p = strpbrk(buf, "w");
// p == "world"
p = strpbrk(buf, "wl");
// p == "llo world"
strtok #
char* strtok(char* str, const char* delim)
Разделяет строку
str
на подстроки по символам-разделителям из строки delim
, возвращает указатель на последний найденный. Модифицирует исходную строку для добавления нулевых символов подстроки. Использование:
char buf[] = "Hello,world,123;space;kek";
char* p = strtok(buf, ",;");
while(p) {
// здесь p по очереди указывает на строки
// "Hello"
// "world"
// "123"
// "space"
// "kek"
p = strtok(NULL, ",;");
}
strtok_r #
char *strtok_r(char *s, const char *delim, char **ptrptr);
То же самое, что
strtok
, но удобнее:
char buf[] = "Hello,world,123;space;kek";
char* sp = buf;
char* p = NULL;
while ((p = strtok_r(sp, ",", &sp)) != NULL) {
// здесь p по очереди указывает на строки
// "Hello"
// "world"
// "123;space;kek"
}