strchr și strrchr în C

Caută un caracter într-un șir: strchr găsește prima apariție, strrchr pe ultima.

Sintaxă
#include <string.h>
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);

Ce face strchr și strrchr

strchr(s, c) parcurge șirul de la început și întoarce un pointer la primul caracter egal cu c. Dacă nu îl găsește, întoarce NULL. strrchr face același lucru, dar întoarce ultima apariție.

Pointerul întors arată în interiorul șirului inițial. Poziția (indicele) se obține prin scădere: p - s. Textul de după caracter este chiar p + 1.

Caracterul căutat este un singur octet. Nu poți căuta o literă cu diacritice în UTF-8 (are 2 octeți) cu strchr; pentru asta folosește strstr(s, "ș").

Parametri

Parametru Descriere
s Șirul în care cauți.
c Caracterul căutat, de exemplu '@'. Căutarea lui '\0' întoarce pointer la terminator.

Ce returnează

Pointer la caracterul găsit sau NULL.

Exemple

Exemplul 1: Domeniul unei adrese de e-mail

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *email = "ana.pop@exemplu.ro";
    const char *aron = strchr(email, '@');
    if (aron != NULL) {
        printf("Utilizator: %.*s\n", (int)(aron - email), email);
        printf("Domeniu: %s\n", aron + 1);
    }
    return 0;
}

Rezultat

Utilizator: ana.pop
Domeniu: exemplu.ro

Exemplul 2: Extensia unui fișier cu strrchr

Numele are două puncte; extensia începe după ultimul, deci strrchr este funcția potrivită.

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *fisiere[] = {"raport.final.pdf", "poza.jpg", "README"};
    for (size_t i = 0; i < 3; i++) {
        const char *punct = strrchr(fisiere[i], '.');
        printf("%-18s -> %s\n", fisiere[i], punct ? punct + 1 : "(fără extensie)");
    }
    return 0;
}

Rezultat

raport.final.pdf   -> pdf
poza.jpg           -> jpg
README             -> (fără extensie)

Greșeli frecvente

  • Folosești rezultatul fără să verifici NULL: dacă textul nu conține caracterul, p + 1 sau *p opresc programul.
  • Modifici șirul printr-un pointer întors de strchr pe un literal ("text"). Literalii șir nu au voie să fie modificați.

Comenzi înrudite

  • strstr: Caută prima apariție a unui subșir într-un șir și întoarce un pointer la ea sau NULL.
  • strtok: Împarte un șir în bucăți (tokeni) după unul sau mai multe caractere separatoare, modificând șirul original.
  • strlen: Numără caracterele unui șir C până la terminatorul ‘\0’, fără să-l includă.
  • Aritmetica pointerilor: Adunarea și scăderea pe pointeri se fac în elemente, nu în octeți: p + 1 arată spre următorul element din tablou.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: strchr și strrchr

Ai o nelămurire despre utilizarea comenzii strchr și strrchr sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.