funkcja strstr

0

Program sprawdza czy pierwsze zdanie jest zawarte w drugim. I moje pierwsze pytanie to dlaczego funkcja printf dziwnie mi wyswietla napis a drugie to jak można zrobić żeby program brał pod uwagę to że zdania mogą być zupełnie różne i w żadną stronę nie będą się zawierały.

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

int main()
{   printf("Sprawdz czy pierwsze zdanie jest zawarte w drugim.\n");
    char napis1[100];
    char napis2[100];
    fgets(napis1, sizeof(napis1), stdin);
    fgets(napis2, sizeof(napis2), stdin);
    char * wynik = strstr( napis2, napis1 );

    if(wynik==napis2)
    {
        printf("Oba zdania sa identyczne ,a wiec sa zawarte w sobie.\n");
    }
    if(wynik!=NULL && wynik!=napis2)
    {
        printf("\"%s\" jest zawarte w \"%s\" ale odwrotnie juz nie.\n",wynik, napis1);
    }
    if(wynik==NULL)
    {
        printf("\"%s\" nie jest zawarte w \"%s\" ale odwrotnie juz tak\n",napis1,napis2);
    }
    
    

    return 0;
}

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Poczytaj jeszcze raz co zwraca funkcja strstr() - z kodu jednoznacznie wynika że nie wiesz.
Poczytaj też o słowie kluczowym else


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
0

Funkcja strstr zwraca nam wszystko do końca jak napotka na szukane wyrazy. to jakiej funkcji powinienem użyć ?

lisu1411
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Biała
  • Postów:29
0

"Funkcja przeszukuje łańcuch znaków str1 w poszukiwaniu łańcucha znaków str2. Jeśli w łańcuchu przeszukiwanym znajduje się więcej niż jedno wystąpienie poszukiwanego ciągu znaków to funkcja zwróci adres na pierwsze wystąpienie. "

Dragonowi chyba chodziło o ten adres.

Zwracana wartość to wskaźnik na pierwsze wystąpienie str2 w łańcuchu str1 lub NULL, jeśli szukany ciąg znaków nie został odnaleziony.

0

To jakiej funkcji powinienem użyć ?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Właśnie tej, tylko że musisz zrozumieć co ona zwraca.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
0

Wydaje mi się że wiem jak działa ta funkcja strstr ale gdy wpisuje do pierwsze zdanie "bitwa pod grunwaldem" i drugie "pod" to powinno wyrzucić "pod grunwaldem" przy takim kodzie

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

int main()
{   printf("Sprawdz czy pierwsze zdanie jest zawarte w drugim.\n");
    char napis1[100];
    char napis2[100];
    fgets(napis1, sizeof(napis1), stdin);
    fgets(napis2, sizeof(napis2), stdin);
    char * wynik = strstr( napis1, napis2 );
    printf("%s",wynik);
    return 0;
}
0

A nie wyrzuca

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0

Jak dla mnie to wyrzuca: http://ideone.com/x7saC0

_13th_Dragon
Nie dałeś entera po drugim wierszu ;P
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1

Ale jak podasz w drugim: - "waldem" - to znajdzie.
Kolejnym problemem jest funkcja fgets która wczytuje razem z enterem (pod windowsami).


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
0
twonek napisał(a):

Jak dla mnie to wyrzuca: http://ideone.com/x7saC0

U mnie w Codeblocksie wyrzuca null ,a wyrzuca jedynie końcówki ciągu i nie wiem dlaczego ?

_13th_Dragon
Napisałem ci dlaczego.
0

Przez tą funkcje gets? o to chodzi?

lisu1411
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Biała
  • Postów:29
0

Dragon przeanalizowałem to co napisałeś i czy chodzi może o to, że w tym momencie

Kopiuj
char napis1[100];
char napis2[100];

gdy przypiszemy do napis1 "Bitwa pod grunwaldem"
a do napis2 "pod" to zwróci nam wskaźnik do adresu

Kopiuj
wynik[6]

czyli literę "p" przez to, że używanmy tablicy znaków?

Skarć mnie jeźeli się mylę :)

0

Mi się wydaje że zwróci na "pod grunwaldem".

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1

@lisu1411, ależ pogmatwałeś ... to co napisałeś nie ma żadnego sensu ...
gdy przypiszemy do napis1 "Bitwa pod grunwaldem" a do napis2 "pod" to polecenie wynik=strstr(napis1,napis2); spowoduje że wskaźnik wynik będzie wskazywał na literę p w napisie napis1 czyli wartość napis1+6.
Przez to że takie jest działanie funkcji strstr, w której niczego oprócz tablicy znaków użyć nie możemy.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
lisu1411
:( przynajmniej doszedłem, że wskaże literę "p" :) chcę wiedzieć tyle co Ty :)
0

Dragon mógłbyś mi jeszcze raz wytłumaczyć czemu funkcja strstr wyswietla mi tylko znaki od końca do spacji ? tzn jak wpisuje w napis1 "bitwa pod grunwaldem" a w napis2 "pod" to wyrzuca null a jeżeli wpisze już "waldem" to mi wyrzuca "waldem"

0

I spróbowałem też zamienić

Kopiuj
fgets(napis1, sizeof(napis1), stdin);
fgets(napis2, sizeof(napis2), stdin) 

na

Kopiuj
 scanf("%99s", napis1);
scanf("%99s", napis2);

ale program pozwala mi tylko wczytać znaki do napis1 a potem Od razu wyrzuca null

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0
Kopiuj
#include <stdio.h>

int main(void)
  {
   char napis1[100];
   scanf("%[^\n]99s",napis1);
   printf("\"%s\"\n",napis1);
   return 0;
  }

http://ideone.com/nymuby


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.