Jeden łańcuch w drugim.

Odpowiedz Nowy wątek
2011-07-26 15:02
0

Witam mam problem z następującym zadaniem:

Napisz funkcję zawiera(), która pobiera jako argumenty dwa wskaźniki łańcuchowe. Jeśli drugi łańcuch zawiera się w pierwszym łańcuchu, funkcja powinna zwrócić adres, pod którym rozpoczyna się łańcuch. Na przykład wywołanie zawiera("pula", "ul") powinno zwrócić adres litery u w słowie pula. Jeśli drugi łańcuch nie zawiera się w pierwszym łańcuchu zwracaną wartością powinien być wskaźnik zerowy.

Napisałem coś takiego:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
 
char *zawiera_lan(char *lancuch, char *lancuch2);
 
int main(void)
{
    char a[100];
    char b[100];
 
    puts("Podaj pierwszy lancuch");
    gets(a);
    puts("Podaj drugi lancuch");
    gets(b);
    printf("%p", zawiera_lan(a, b));
    getchar();
    getchar();
    return 0;
}
 
char *zawiera_lan(char *lancuch, char *lancuch2)
{
    char *wsk;
    int i = 0;
 
    while(*lancuch)
    {
        if (i = strlen(lancuch2))
            break;
        if (*lancuch == *lancuch2)
        {
            if (i == 0)
                wsk = lancuch;
            i++;
            lancuch++;
            lancuch2++;
        }
        else if (*lancuch != *lancuch2)
        {
            i = 0;
            lancuch++;
            lancuch2++;
            wsk = NULL;
        }
 
    }
    return wsk;
}

Po wpisaniu obu łańcuchów wywala mi błąd, że wsk jest użyte przed inicjalizacją. Nie wiem bardzo w czym problem i nie mam do końca pewności czy ten kod jest w miarę poprawny. Proszę o jakieś porady co jest nie tak.

edytowany 1x, ostatnio: olek1, 2011-07-26 15:03

Pozostało 580 znaków

2011-07-26 15:55

Zrób choćby:

char *wsk = NULL;

Chodzi o ot, że masz return wsk, chociaż wcale nie ma gwarancji, że cokolwiek zostanie do wsk przypisane. Bo co jeśli w pierwszej iteracji while'a, i = strlen(lancuch2)? Wtedy wsk jest nieprzypisane do niczego, i nie wiadomo co zwrócić...

btw, na pewno nie masz błędu tutaj?

if (i = strlen(lancuch2))
    break;
edytowany 3x, ostatnio: aurel, 2011-07-26 15:55

Pozostało 580 znaków

2011-07-26 17:41
0

Rzeczywiście, powinno być tak:

if (i == strlen(lancuch2))
    break;

Wielkie dzięki za odpowiedź. Teraz wszystko gra.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0