Jeden łańcuch w drugim.

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.

1

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;
0

Rzeczywiście, powinno być tak:

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

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

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