Comportamentul functiei strchr

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
mircea2011
Junior
Junior
Posts: 27
Joined: 11 Aug 2011, 23:12
Judet: Olt

Comportamentul functiei strchr

Post by mircea2011 » 06 Feb 2013, 21:50

Salut.
Incerc sa fac un program care sa afiseze prima aparitie a unui caracter intr-un sir utilizand o functie care sa simuleze comportamentul functiei "strchr" din fisierul antet string.h.
Daca caracterul nu se gaseste in sir afiseaza un mesaj correspunzator. Problema este ca acest lucru programul nu il face.

#include <stdio.h>
#include <stdlib.h>

char *strchr(char *sir, int litera)
{
while((*sir != litera) && *sir)
sir++;
return (sir);
}

int main()
{
char *p = "Acum ascult muzica", ch, *ptr;
printf("\n Cauta caracterul in sirul \"%s\"\n", p);
printf("\n Dati un caracter : ");
ch = getchar();
ptr = strchr(p, ch);
if(ptr)
printf("\n Gasit la pozitia %d\n", ptr-p+1);
if(ptr == NULL)
printf("\n Caracterul \"%s\" nu s-a gasit in sir\n", ptr-p);
return 0;
}



User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Comportamentul functiei strchr

Post by bu7ch3r » 06 Feb 2013, 22:33

Pai, ce se intampla daca dereferentiezi un pointer NULL? Memory violation/segmentation fault, nebunii ce sa mai.
De aici pleaca toata treaba:

Code: Select all

char *strchr(char *sir, int litera)
{
while((*sir != litera) && *sir)
sir++;                                       //Trec de la 'a' la NULL. la urmatorul loop ce se intampla...crapa. De ce? Ca asa are el chef
return (sir);
}
Regula 1. Inainte sa incerci sa accesezi valoare unui pointer cu '*' sau cu '->' trebuie sa verifici adresa, adresa nu e '*str' e 'str'.
Regula 2. Bazata pe regula 1, intai verifici apoi accesezi.

In concluzie:

Code: Select all

char *strchr(char *sir, int litera)
{
while( str &&  (*sir != litera))  //fara '*' - operator de indirectare
sir++;                                       //Trec de la 'a' la NULL. Cum o sa verific NULL-ul la urmatorul loop o sa ies din while si o sa returnez sir, care e NULL.
return (sir);
}
LE: Cateodata getchar ala, e nebun si iti intoarce codul lui ENTER, pentru ca pe tzava da de intare a ramas 'enter' nefolosit. Acum nush, unii zic sa faci flush pe stdin altii pe stdout, eu mai pun un getch() inainte de ceva=getch() ca sa rezolv treaba :D
Cu stima,
Lupu Claudiu

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Comportamentul functiei strchr

Post by bu7ch3r » 06 Feb 2013, 23:09

Si mai sunt probleme:

Code: Select all

printf("\n Caracterul \"%s\" nu s-a gasit in sir\n", ptr-p);
daca ptr e prin pastai sau NULL, atunci 0/NULL - pointer o sa dea NULL, de ce vrei sa afisezi NULL, afiseaza 'ch' ca de el e vorba. Daca afisezi un char schimba din %s, %d....
AAA si uneori '\0' nu e acelasi cu NULL:). In loc sa verifici cu NULL verifica sa nu fie '\0'.

Cam asa: http://ideone.com/iAT2WH
Cu stima,
Lupu Claudiu

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: Comportamentul functiei strchr

Post by Viorel » 07 Feb 2013, 00:05

Pentru a simula strchr, ar trebui să returnezi NULL dacă caracterul nu a fost găsit. Încearcă astfel:

Code: Select all

return *sir ? sir : NULL;
Last edited by Viorel on 07 Feb 2013, 14:33, edited 1 time in total.

User avatar
Knuth
Junior
Junior
Posts: 15
Joined: 02 Feb 2012, 12:17
Judet: Hunedoara
Contact:

Re: Comportamentul functiei strchr

Post by Knuth » 07 Feb 2013, 11:24

bu7ch3r wrote: Regula 1. Inainte sa incerci sa accesezi valoare unui pointer cu '*' sau cu '->' trebuie sa verifici adresa, adresa nu e '*str' e 'str'.
Regula 2. Bazata pe regula 1, intai verifici apoi accesezi.

In concluzie:

Code: Select all

char *strchr(char *sir, int litera)
{
while( str &&  (*sir != litera))  //fara '*' - operator de indirectare
sir++;                                       //Trec de la 'a' la NULL. Cum o sa verific NULL-ul la urmatorul loop o sa ies din while si o sa returnez sir, care e NULL.
return (sir);
}
Explica-ne, rogu-te, cum poate ajunge "sir" sa fie NULL (ala pe care l-ai rebotezat tu "str"). De asemenea, explica-ne cind crezi tu ca se opreste while-ul din codul tau.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Comportamentul functiei strchr

Post by bu7ch3r » 07 Feb 2013, 14:01

Da Knuth, am fost putin(total) ambiguu recunosc, numai in urma apelarii lui strchr(NULL, ...) "sir" ala poate sa vina NULL. Nu e chiar eficient sa verifici de fiecare data asta in loop si stiu ca functiile standard nu verifica nici macar la inceput.
Cine stie cand se opreste while-ul ala, poate peste 1000 de iteratii, poate peste 95, poate peste 798 cine stie :-??

Mai greseste omul, imi cer scuze!
Nu e chiar grav sfatul meu :) N-are legatura cu subiectul da e bine de tinut minte, merge ?
Cu stima,
Lupu Claudiu

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Comportamentul functiei strchr

Post by bu7ch3r » 07 Feb 2013, 14:23

Da carciumare, nu te contrazic!
Daca vreti sa ma convingeti ca am incurcat capra cu varza nu trebuie, mi-am dat seama de dimineatza :)
Nu pot sa ma scot din asta, asa ca nu o fac. Am dat cu tarnacopul si l-am ametit pe mircea2013:)

Acum ce facem ?
Cu stima,
Lupu Claudiu

mircea2011
Junior
Junior
Posts: 27
Joined: 11 Aug 2011, 23:12
Judet: Olt

Re: Comportamentul functiei strchr

Post by mircea2011 » 07 Feb 2013, 17:55

Oh, calm down boys! :whorship:
Toti facem greseli. Pana la urma suntem aici sa invatam.
Numai bine.

Post Reply