2010-09-22 19 views
5
/* strchr example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] = "This is a sample string"; 
    char * pch; 
    printf ("Looking for the 's' character in \"%s\"...\n",str); 
    pch=strchr(str,'s'); 
    while (pch!=NULL) 
    { 
    printf ("found at %d\n",pch-str+1); 
    pch=strchr(pch+1,'s'); 
    } 
    return 0; 
} 

W jaki sposób zindeksować str, aby zastąpić każdy z "r".Jak zastąpić znak w tym przykładzie za pomocą strchr?

Dzięki.

+0

prostu ciekawi - jest to praca domowa, albo starasz nauczyć się C na własną rękę? –

+0

na własną rękę ....... –

Odpowiedz

9

Nie trzeba indeksować ciągu znaków. Masz wskaźnik do znaku, który chcesz zmienić, więc przypisać poprzez wskaźnik:

*pch = 'r'; 

W ogóle, choć, wskaźnik korzystania []:

ptrdiff_t idx = pch - str; 
assert(str[idx] == 's'); 
+0

Tak, właśnie tego szukam, dziękuję. Odwołuje się do postaci, której dotyczy, i zastępuje ją nowym znakiem. –

1
void reeplachar(char *buff, char old, char neo){ 
    char *ptr;   
    for(;;){ 
     ptr = strchr(buff, old); 
     if(ptr==NULL) break; 
     buff[(int)(ptr-buff)]=neo; 
    }   
    return; 
} 

Wykorzystanie:

reeplachar(str,'s','r'); 
+0

Ok Byłem ciekawy jak uzyskać indeks ze wskaźnika, więc wpisujesz go do int z: (int) (ptr-buff)? –

+1

@Tommy tak, to są indeksy, jeśli chcesz je wszystkie, potrzebujesz nowej tablicy int do przechowywania w –

0

Pod warunkiem, że program rzeczywiście wyszukuje pozycje bez błędu (nie sprawdziłem), twoje pytanie brzmi: jak zmienić zawartość obiektu, na który wskazuje już wskaźnik pch?

3

można użyć następujących funkcji:

char *chngChar (char *str, char oldChar, char newChar) { 
    char *strPtr = str; 
    while ((strPtr = strchr (strPtr, oldChar)) != NULL) 
     *strPtr++ = newChar; 
    return str; 
} 

Po prostu biegnie przez ciąg patrząc na specyfikę i zastępuje go nowym charakterze. Za każdym razem (tak jak z twoim) zaczyna się od adresu znajdującego się poza poprzednim znakiem, aby nie sprawdzać ponownie znaków, które zostały już sprawdzone.

zwraca również adres napisu, trik często wykorzystywane, dzięki czemu można używać wartości zwracanej, a także, tak jak w przypadku:

printf ("%s\n", chngChar (myName, 'p', 'P')); 
Powiązane problemy