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ę