Funkcje operujące na łańcuchach znaków

Prototypy wszystkich opisanych tu funkcji znajdują się w pliku <STRING.H>

Na tej stronie znajdziesz krótki opis każdej funkcji z podaniem składni, wymaganych parametrów i zwracanej wartości. Dla niektórych funkcji znajdziesz przykłady własnej ich implementacji. Na końcu strony znajdziesz większy program, który stanowi przegląd pracy z łańcuchami znakowymi za pomocą funkcji standardowych.

| strcat | strchr | strcmp | strcmpi | strcpy | strcspn | strerror | strlen | strncat | strncpy | strpbrk | strrchr | strspn | strstr | strtok | przykład |
strcat
Dokleja kopię łańcucha podanego w drugim parametrze do łańcucha podanego w pierwszym parametrze. Długość otrzymanego łańcucha jest sumą długości obu parametrów.
Składnia:char *strcat(char *str1, const char *str2);
gdzie:str1 - łańcuch, do którego dołączamy (musi być zmienną)
str2 - dołączany łańcuch (zmienna lub stała)
Zwracana wartość:wskaźnik do złączonego łańcucha
strchr
Wyszukuje pierwszego wystąpienia podanego znaku w łańcuchu. Znak końca łańcucha (NULL) jest również sprawdzany.
Składnia:char *strchr(const char *str, int znak);
gdzie:str - łańcuch, w którym szukamy znaku
znak - poszukiwany znak
Zwracana wartość:gdy znak został znaleziony - wskaźnik do znaku, w przeciwnym razie NULL
Własna implementacja funkcji:
char *strchr(char *str, int znak)
{ while( str != '\0' )
  { if ( str == znak ) return str;
    str = str + 1;
  }
  return NULL;
}
strcmp
Porównuje 2 łańcuchy znaków. Porównywane są kolejno wszystkie odpowiadające sobie znaki w obu łańcuchach.
Składnia:int strcmp(const char *str1, const char*str2);
gdzie:str1 - pierwszy porównywany łańcuch
str2 - drugi porównywany łańcuch (zmienna lub stała)
Zwracana wartość:wartość < 0, gdy str1 < str2
wartość == 0, gdy str1 == str2
wartość > 0, gdy str1 > str2
Własna implementacja funkcji:
int  strcmp(char *str1, char *str2)
{ while( *str1 == *str2 )
  { if ( *str1 == '\0' )  return 0;
    str1 = str1 + 1;
    str2 = str2 + 1 ;
  }
  return (*str1 - *str2);
}
strcmpi
Porównuje 2 łańcuchy znaków bez odróżniania wielkości liter. Porównywane są kolejno wszystkie odpowiadające sobie znaki w obu łańcuchach.
Składnia:int strcmpi(const char *str1, const char*str2);
gdzie:str1 - pierwszy porównywany łańcuch (zmienna lub stała)
str2 - drugi porównywany łańcuch (zmienna lub stała)
Zwracana wartość:wartość < 0, gdy str1 < str2
wartość == 0, gdy str1 == str2
wartość > 0, gdy str1 > str2
strcpy
Kopiuje drugi łańcuch do pierwszego, łącznie z końcowym znakiem NULL
Składnia:char *strcpy(char *str1, const char *str2);
gdzie:str1 - łańcuch, do którego kopiujemy (musi być zmienną)
str2 - łańcuch, który kopiujemy (zmienna lub stała)
Zwracana wartość:wskaźnik do str1
Własna implementacja funkcji:
char * strcpy(char *str1, char *str2)
{ char *pocz = str1;
  while( ( *str1 = *str2 ) != '\0' )
  { str1++;
    str2++;
  }
  return  pocz;
}
strcspn
Funkcja lokalizuje w parametrze str1 pierwsze wystąpienie znaku (oprócz NULL) należącego do str2
Składnia:size_t strcspn(const char *str1, const char *str2);
gdzie:str1 - łańcuch, w którym szukamy któregoś ze znaków znajdujących się str2
str2 - łańcuch zawierający zbiór znaków, z których chcemy wyszukać którykolwiek w str1
Zwracana wartość:jeżeli zostanie znaleziony którykolwiek znak z str2 w str1, to funkcja zwraca jego indeks w łańcuchu str1, w przeciwnym razie zwracana jest długość łańcucha str1
strerror
Zwraca wskaźnik do komunikatu błędu o podanym numerze.
Składnia:char *strerror(int nr_błędu);
gdzie:nr_błędu - numer błędu, dla którego chcemy pobrać komunikat
Zwracana wartość:wskaźnik do miejsca pamięci, gdzie zapisany jest komunikat błędu o podanym w parametrze numerze.
strlen
Oblicza i zwraca ilość znaków w łańcuchu bez końcowego znaku NULL.
Składnia:size_t strlen(const char *str);
gdzie:str - łańcuch, którego długość chcemy ustalić
Zwracana wartość:ilość znaków w łańcuchu bez końcowego znaku NULL.
Własna implementacja funkcji:
char *strchr(char *str)
{ size_t n = 0;
  while( str != '\0' )  
  { n++;
    str=str+1;
  }
  return n;
}
strncat
Dołącza część jednego łańcucha znaków do drugiego. Dołączanych jest max pierwszych znaków z str2 do str1 lub cały łańcuch str2, jeżeli jego długość jest mniejsza od max
Składnia:char *strncat(char *str1, const char *str2, size_t max);
gdzie:str1 - łańcuch, do którego dołączamy (musi być zmienną)
str2 - dołączany łańcuch
max - maksymalna ilość dołączanych znaków
Zwracana wartość:wskaźnik do str1.
strncpy
Kopiuje część jednego łańcucha znaków do drugiego. Kopiowanych jest max pierwszych znaków z str2 do str1 lub cały łańcuch str2, jeżeli jego długość jest mniejsza od max
Składnia:char *strncpy(char *str1, const char *str2, size_t max);
gdzie:str1 - łańcuch, do którego dołączamy (musi być zmienną)
str2 - dołączany łańcuch
max - maksymalna ilość dołączanych znaków
Zwracana wartość:wskaźnik do str1.
strpbrk
Poszukuje w łańcuchu str1 pierwszego wystąpienia dowolnego znaku należącego do łańcucha str2 (oprócz końcowego NULL).
Składnia:char *strpbrk(const char *str1, const char *str2);
gdzie:str1 - łańcuch, który przeszukujemy
str2 - ciąg zawierający lokalizowane znaki
Zwracana wartość:wskaźnik do pierwszego wystąpienia w str1 któregokolwiek ze znaków z str2 lub NULL, jeżeli oba łańcuchy nie mają ani 1 wspólnego znaku.
strrchr
Wyszukuje ostatniego wystąpienia podanego znaku w łańcuchu. Znak końca łańcucha (NULL) jest również sprawdzany.
Składnia:char *strrchr(const char *str, int znak);
gdzie:str - łańcuch, w którym szukamy znaku
znak - poszukiwany znak
Zwracana wartość:gdy znak został znaleziony - wskaźnik do znaku, w przeciwnym razie NULL
strspn
Funkcja lokalizuje w parametrze str1 pierwsze wystąpienie znaku (oprócz NULL) NIE należącego do str2
Składnia:size_t strcspn(const char *str1, const char *str2);
gdzie:str1 - łańcuch, w którym szukamy znaków NIE znajdujących się w str2
str2 - łańcuch opisujący ciąg znaków
Zwracana wartość:indeks pierwszego znaku w str1, który nie należy do str2 lub długość łańcucha str1
strstr
Poszukuje w łańcuchu str1 pierwszego wystąpienia łańcucha str2.
Składnia:char *strstr(const char *str1, const char *str2);
gdzie:str1 - łańcuch, który przeszukujemy
str2 - poszukiwany łańcuch
Zwracana wartość:wskaźnik do pierwszego wystąpienia w str1 łańcucha str2 lub NULL, jeżeli nie str2 nie został znaleziony w str1.
strtok
Wyodrębnia z łańcuchu str1 podciągi (tokeny) ograniczone którymś ze znaków podanych w str2. Łańcuch str2 może być inny przy każdym wywołaniu funkcji z tym samym łańcuchem str1. Wywołanie funkcji zwraca wskaźnik do pierwszego znaku znalezionego podciągu (tokena) i zapisuje znak NULL na znaku kończącym token (należącym do str2).
Składnia:char *strtok(char *str1, const char *str2);
gdzie:str1 - łańcuch, który przeszukujemy
str2 - lista znaków rozdzielających tokeny
Zwracana wartość:wskaźnik do wyodrębnionego w str1 podciągu, jeżeli taki wystąpił lub NULL, jeżeli w str1 nie ma żadnego podciągu (tokena).

Przykładowy program operujący na łańcuchach znaków za pomocą funkcji:
#include <stdio.h>
#include <string.h>
#include <conio.h>

void main(void)
{  char *str1 = "Programowanie";
   char *str3 = " w C++";
   char str2[50];
   char znak;

   clrscr();
   // wyświetlanie fragmentów łańcucha znaków
   printf("Pełny napis       : %s\n", str1);
   printf("Pominięty znak 0  : %s\n", (str1 + 1));
   printf("Pominięte 4 znaki : %s\n", (str1 + 4));
   printf("Pominięte 7 znaków: %s\n\n", (str1 + 7));
   getch();

   // kopiowanie określonej ilości znaków z łańcucha do innej zmiennej
   strncpy(str2 , str1 , 5);
   printf("str2 po skopiowaniu 5 znaków z str1 : %s\n" , str2);
   getch();

   // kopiowanie łańcucha znaków do innej zmiennej
   stpcpy(str2 , str1);
   printf("Skopiowanie str1 do str2 : %s\n" , str2);
   getch();

   // sklejanie łańcuchów znaków
   strcat(str2 , str3);
   printf("%s\n" , str2);
   strcat(str2 , " to jest TO");
   printf("Sklaejone napisy : %s\n" , str2);
   getch();

   // sprawdzenie długości łańcucha znaków
   printf("Długość str1 = %d\n", strlen(str1));
   printf("Długość str2 = %d\n\n", strlen(str2));
   getch();

   // wyszukiwanie znaku w łańcuchu znaków
   printf("Podaj szukany znak: ");
   znak=getche();
   if (strchr(str1 , znak) == NULL)
       printf("\nZnak \"%c\" nie występuje w napisie\n");
   else
       printf("\nZnak \"%c\" występuje na pozycji: %i\n", znak, strchr(str1 , znak));
   getch();

   // dokładne porównywanie łańcuchów znaków
   printf("\nProgramowanie == Programowanie  ==>  %d", strcmp(str1 , "Programowanie"));
   printf("\nProgramowanie == programowanie  ==>  %d", strcmp(str1 , "programowanie"));
   printf("\nProgramowanie == PROGRAMOWANIE  ==>  %d", strcmp(str1 , "PROGRAMOWANIE"));
   getch();

   // porównywanie łańcuchów znaków bez odróżniania wielkości liter
   printf("\n\nProgramowanie == Programowanie  ==>  %d", strcmpi(str1 , "Programowanie"));
   printf("\nProgramowanie == programowanie  ==>  %d", strcmpi(str1 , "programowanie"));
   printf("\nProgramowanie == PROGRAMOWANIE  ==>  %d", strcmpi(str1 , "PROGRAMOWANIE"));
   getch();

   // konwersja wielkości liter
   printf("\n\nWielkie litery : %s" , strlwr(str1));
   printf("\nNałe litery      : %s" , strupr(str1));
   getch();
}