мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
c:c_ultimate_guide:string.h [2025/11/04 14:31] – создано radi0devc:c_ultimate_guide:string.h [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in
Строка 22: Строка 22:
 ===== strcat ===== ===== strcat =====
 Функция strcat объединяет две строки в одну. Она имеет следующий прототип: Функция strcat объединяет две строки в одну. Она имеет следующий прототип:
- 
 <code c> <code c>
 char *strcat(char *destination_str, const char *source_str);'' char *strcat(char *destination_str, const char *source_str);''
 </code> </code>
 +
 +Функция копирует символы из строки source_str в destination_str. При этом первая строка должна иметь достаточную длину, чтобы вместить вторую.
  
 <code c> <code c>
 +#include <stdio.h>
 +#include <string.h>
 + 
 +int main(void) {
 +  char destination[20];
 +  char source[20] = "Hello world";
 +  strcpy(destination, source);
 +  printf("%s\n", destination); // Hello world
 +  return 0;
 +}
 +</code>
  
 +===== strncpy =====
 +
 +Стоит отметить, что эта функция копирует символы из source в destination, пока не встретит нулевой байт \0. Теоретически это может приводить к переполнению буфера. И для избежания этой проблемы есть другая функция - strncpy, которая в качестве третьего параметра принимает количество копируемых символов:
 +
 +<code c>
 +#include <stdio.h>
 +#include <string.h>
 +  
 +int main(void) {
 +  char destination[20];
 +  char source[20] = "Hello METANIT.COM!!";
 +  int n = 20; // количество копируемых символов
 +  strncpy(destination, source, 20);
 +  destination[n-1] = '\0';
 +  printf("%s\n", destination); // Hello METANIT.COM
 +  return 0;
 +}
 </code> </code>
  
-===== strcpy =====+Однако функция strncpy имеет другую проблему - скопированная строка НЕ заканчивается нулевым байтом, что опять же в будущем может привести к переполению буфера. Поэтому после копирования следует вручную устанавливать нулевой байт 
 + 
 +===== strncpy_s =====
  
 <code c> <code c>
 +errno_t strncpy_s(char * destination, size_t destmax, const char * source, size_t srcmax);
 +<code>
  
 +Эта функция принимает дополнительные параметры - destmax - максимальное количество копируемых символов в буфер destination и srcmax - максимальное количество копируемых символов из строки source. В качестве результата функция возвращает информацию об ошибке:
 +
 +<code c>
 +#include <stdio.h>
 +#include <string.h>
 +  
 +int main(void) {
 +  char destination[20];
 +  char source[] = "Hello METANIT.COM!";
 +  int n = 20; // количество копируемых символов
 +  strncpy_s(destination, n, source, n); 
 +  printf("%s\n", destination); // Hello METANIT.COM
 +  return 0;
 +}
 </code> </code>
  
 ===== strstr ===== ===== strstr =====
 +
 +Функция strstr ищет в строке определенную подстроку. Она имеет следующий прототип:
  
 <code c> <code c>
 +char *strstr(const char* string, const char* substring);
 +</code>
  
 +Функция ищет подстроку substring в строке string и возвращает указатель на символ первого вхождения подстроки, то есть по сути адрес подстроки. Если от адреса первого символа строки вычесть адрес первого входжения подстроки, то мы получим индекс подстроки в строке:
 +
 +<code c>
 +#include <stdio.h>
 +#include <string.h>
 + 
 +int main(void) {
 +  char text[20] = "Hello METANIT.COM!";
 +  char substring[14] = "METANIT.COM";
 +  char *substring_ptr = strstr(text, substring);
 +  // если подстрока найдена
 +  if(substring_ptr) {
 +    // вычисляем позицию подстроки в строке
 +    long position = substring_ptr - text;
 +    printf("Substring index: %ld\n", position);     // Substring index: 6
 +  } else { // если подстрока не найдена
 +    printf("Substring not found\n");
 +  }
 +  return 0;
 +}
 </code> </code>