Sprawdzanie czy drugi napis znajduje się na początku pierwszego (Język C)

0

Witam! Z programowania mam zadanie o następującej treści:

"Napisz funkcję mającą w sumie trzy parametry - dwa napisy oraz wskaźnik na zmienną całkowitą. Zadaniem funkcji jest sprawdzić, czy drugi napis jest identyczny z początkiem pierwszego napisu (czyli czy pierwszy napis zawiera na swoim początku drugi napis). Jeżeli pierwszy napis nie zawiera drugiego funkcja ma zwrócić wskaźnik zerowy ( NULL ). W przeciwnym wypadku zwrócony ma zostać adres znaku (wskaźnik do miejsca w pierwszym napisie), który jest pierwszym znakiem nie występującym w drugim napisie. Ponadto funkcja powinna w poprzez trzeci parametr (wskaźnik) zwrócić długość drugiego napisu. W funkcji nie wolno używać funkcji strlen(). Funkcję należy dwukrotnie wywołać w main() z przykładowymi danymi (raz dla przypadku gdy drugi napis występuje na początku pierwszego, a drugi raz - gdy nie występuje) i jeżeli to możliwe to wypisać zawartość pamięci znajdującej się pod zwróconym przez return adresem oraz długość drugiego napisu."

Program mam napisany i o ile pokazuje mi adres znaku i adres pamięci, to wartość znaku jest zła, bo wskazuje na litere "a" a powinno na "n"... Nie wiem już co i gdzie mam poprawić :/ Poniżej wstawiam kod programu, który już napisałem:

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

int podstring(char tab1[], char tab2[]){
    char *wsk=NULL;
    int adres;
    int i;
    for(i=0;i<sizeof(tab2);i++){
            adres=tab1[i];
        if(tab2[i]!=tab1[i]){
            return wsk;
        }
        else if(tab2[i]==tab1[i]){
            printf("Wartosc znaku: %d\n", adres);
            printf("Adres znaku: %d\n", &adres);
                for(i=0;*(tab2+i)!='\0';i++){
                } printf("Dlugosc napis2: %d\n", i);
        }
    }
}

main(){
    int i, pam;
    char napis1[100]="alanoidalny";
    char napis2[100]="ala";
    char napis3[100]="doponoidalny";
    char napis4[100]="lokpano";

    printf("Pierwsze wywolanie: \n");
    printf("\n");
    podstring(napis1, napis2);

    printf("\n");

    printf("Drugie wywolanie: \n");
    printf("\n");
    pam=podstring(napis3, napis4);
    printf("Adres pamieci: %d", &pam);
    printf("\n");
        for(i=0;napis4[i]!='\0';i++){
        } printf("Dlugosc napis4: %d\n", i);
        printf("\n");

system("PAUSE");
return 0;
}

Proszę o pomoc w doszlifowaniu programy. Z góry dziękuje!

3

Napisz funkcję mającą w sumie trzy parametry - dwa napisy oraz wskaźnik na zmienną całkowitą.
Jeżeli pierwszy napis nie zawiera drugiego funkcja ma zwrócić wskaźnik zerowy ( NULL ). W przeciwnym wypadku zwrócony ma zostać adres znaku (wskaźnik do miejsca w pierwszym napisie), który jest pierwszym znakiem nie występującym w drugim napisie.

W jaki sposób poniższa sygnatura spełnia te wymagania?

int podstring(char tab1[], char tab2[])

Przy okazji, zadanie nie zabrania używać strncmp. Zakładam, że by Ci nie zaliczyli, ale jeśli o strlen wspomnieli... :D

3
  1. to co napisał @kq
for(i=0;i<sizeof(tab2);i++){ 

czyli Twoim zdaniem napis bedzie zawsze wielkości wskaźnika
3) zmienne tekstowe najlepiej przekazywać jako const char *
4) są przypadki, gdy funkcja zwróci bzdury, albo NULL Za return w środku funkcji to coś za co powinno sie połapkach dawać. (z takich ciekawostek ostatnio poprawiając czyjs kod produkcyjny znalazłem taki samotny return w środku - cąle szczęście sytuacja była mało prawdopodobna, ale możliwa, problem - poza czytelnością czegoś takiego był taki, że był ustawiony semafor, który nie był zdjęty, gdyz wcześniej ktoś zrobił radośnie returna z funkcji z kodem błędu - programującym nie musze tłumaczyć, że całośc programu pójdzie wtedy w krzaki... - hehehe @kq nie bierz tego do siebie :P)

Tyle na szybko.

1
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  3. Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091
char *podstring(char *str,char *sub,int *len)
  {
   char *p=sub;
   while(*p) ++p;
   *len=p-sub;
   for(p=sub;*p;++str) if(*str!=*p++) return str;
   return NULL;
  }
2

Używaj tagów <code​>

char* podstring(char tab1[], char tab2[]){

Zgadywanka: który wyraz z wyrażenia "trzy parametry" nie pasuje?

0

Dziękuje wszystkim bardzo za pomoc, program już działa tak jak należy :) TEMAT DO ZAMKNIĘCIA

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