pobranie napisu - błąd

0

Witam, mam taki problem: nie wiem czemu program nie działa dobrze, gdy napis2 wpisuje się do tablicy.
Program ma za zadanie porównać napisy w tablicach napis1 i napis2, i jeśli napis2 jest zawarty w napis1, to go usuwa z napis1, np
napis1="siema co tam", napis2="co", wynikiem działania programu będzie napis1="siema tam"

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ROZMIAR 20
#define BLAD "Blad! Napis w napis2 nie moze byc wiekszy od napisu w napis1!"
#define BRAK "napis2 nie jest zawarty w napis1!"

void wytnij(char napis[], int znaki, int poczatek)
{
    int i=poczatek, j, x=poczatek;
    char tablica[ROZMIAR];
    for(j=0;j<znaki;j++){
        for(i=poczatek;i<=ROZMIAR;i++){
            for(x=0;x<ROZMIAR;x++)
                tablica[x]=napis[x];
            napis[i]=tablica[i+1];
        }
    }
}

int czy_zawarte(char napis1[], char napis2[], int *poczatek) // Sprawdza, czy napis2 jest zawarty w napis1
{
    int i, j=0, znaki, licz=0;
    znaki=zlicz_znaki(napis2);
    for(i=0;i<ROZMIAR;i++){
        if(napis1[i]==napis2[j] && napis2[j]!=0 && napis2[j]!=' '){
                licz++;
                j++;
            if(licz==znaki){
                *poczatek=i+1-znaki;
                return licz;
            }
        }
        else{
            j=0;
            licz=0;
            if(i==ROZMIAR-1)
                return false;
        }
    }
}

int zlicz_znaki(char napis[]) // Zlicza znaki we wprowadzonym napisie
{
    int i, licz=0;
        for(i=0;i<ROZMIAR;i++)
            if(napis[i]==' ' || napis[i]==0)
                licz++;
    return ROZMIAR-licz;
}

int sprawdz_napisy(char napis1[], char napis2[]) // Czy napis1 jest wiekszy rowny od napis2
{
    int tab1, tab2;
        tab1=zlicz_znaki(napis1);
        tab2=zlicz_znaki(napis2);
    if(tab1<tab2)
        return false;
    else
        return true;
}

void przytnij(char napis1[]) // uzyc while // Wykonuje usun spacje
{
    char tablica[ROZMIAR];
    int j;
    for(j=0;j<ROZMIAR;j++)
        tablica[j]=napis1[j];
    for(j=0;napis1[j]!='\0';j++)
        napis1[j]=tablica[j+1];
}

void usun_spacje(char napis[]) // Usuwa spacje
{
    int i;
    for(i=0;napis[i]!='\0';i++)
        if(napis[0]==' ')
            przytnij(napis);
}

int napisy(char napis1[], char napis2[])
{
    int i, poczatek, znaki;
    usun_spacje(napis1); // Usuwa odstepy sprzed napisu
    usun_spacje(napis2);
    if(sprawdz_napisy(napis1, napis2)){ // Sprawdza, czy napis w napis1 jest wiekszy rowny od tego w napis2
        znaki=czy_zawarte(napis1, napis2, &poczatek); // Sprawdza, czy napis2 jest zawarty w napis1
        if(znaki){
            printf("napis2 miesci sie w napis1! Zostanie usunietych %d znakow z napis1.\n\n", znaki);
            wytnij(napis1, znaki, poczatek); // Wycina napis2 z napis1
            usun_spacje(napis1);
            return true;
        }
        else
            puts(BRAK);
    }
    else{
           puts(BLAD);
           return false;
    }
}

int main()
{
    char napis1[ROZMIAR], napis2[ROZMIAR];
    printf("Podaj napis1 i napis2, o ilosci znakow mniejszej niz %d\n", ROZMIAR);
    scanf("%s", napis1);
    scanf("%s", napis2);
    if(napisy(napis1, napis2)) // Jesli wszystko jest ok wyswietla zmieniony tekst, dodac przeciwny przypadek
        printf("Tekst po zmianie to: %s\n", napis1);
    return 0;
}

 

Cały algorytm itd jest ok, bo w przypadku gdy w mainie da się przykładowo:

char napis1[ROZMIAR]="cplus", napis2[ROZMIAR]="plus"

i usunie scanf, to program wyświetli literkę c - tak jak powinien
Jeśli użyję scanf do napis1 i napis2 będzie podany, to nadal jest ok.
Lecz jak już chcę pobrać obydwa napisy, to wyświetla błąd (nie wiem czemu), proszę o wskazówkę

0

Czyli twierdzisz, ze jesli zrobie funkcje dodaj przyjmujaca 2x int, i za kazdym razem zwroci wartosc 4, tzn. ze algorytm jest dobry bo dla argumentow: 2 i 2 dziala? Wskazowka jest jedna calosc jest napisana ogolnie kiepsko i bez wiekszego pomyslunku. Nad czym sa powinienes sie zastanowic i przemyslec, jedyne czego mozesz nie wiedziec, to to, ze masz 2 buffer overflowy w tych scanfach.

1

Wszędzie tam gdzie występuje ROZMIAR za wyjątkiem main - masz błąd.
Jeżeli zainicjalizowałeś stałym napisem to reszta tablicy wypełniła się zerami a jeżeli nie to w tablice po znaku końca napisu są śmiecie które twoje funkcje też uwzględniają.

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