Zamiana danego znaku na inny znak w napisie

0

Witam. Mam do napisania program w którym:

  1. Za pomocą fgets wprowadzam napis o długości <=99 do globalnej statycznej tablicy
  2. Wpisuję znak
  3. Funkcja zmiana zastępuje wszystkie zadeklarowane przedtem w programie znaki (litera) na te wpisane przez użytkownika (znak)
  4. Wypisanie napisu

Mam takie coś:

#include <iostream>
#include <cstdio>

using namespace std;

char tablica[100];

void zmiana(char litera, char znak)
{
    for (int i=0;i<99;i++)
    {
        if (tablica[i]=='\0')
            break;
        else
        {
            if (tablica[i]==litera)
                tablica[i]=znak;
            else
                i++;
        }
    }
}
int main()
{
    char znak;
    char litera = ' ';
    cout << "Enter a string: \n";
    fgets (tablica,sizeof(tablica),stdin);
    cout << "Enter a character: \n";
    cin >> znak;
    zmiana(litera,znak);
    cout << tablica;
    return 0;
}

I niestety program działa częściowo. Na przykład po wpisaniu:

ala ma dwa koty

a następnie x jako znaku, który ma wskoczyć za spację dostaję:

ala maxdwa koty

zamiast alaxmaxdwaxkoty

Gdzie tkwi problem?

1

I tak masz szczęście że jakakolwiek spacja została zamieniona

for (int i = 0; i < 99; i++)
{
	if (tablica[i] == '\0')
	{
		break;
	}
	else
	{
		if (tablica[i] == litera)
		{
			tablica[i] = znak;
		}
		else
		{
			i++; // <-- Tu jest Twój problem
		}
	}
}

Celowo dodałem nawiasy aby łatwiej było dostrzec strukturę kodu.
Zobacz że jeżeli znak nie jest '\0' oraz znakiem którego szukasz to inkrementujesz indeks (i) a następnie w pętli indeks jest znowu zinkrementowany. Dlatego przeskakuje Ci 1 oraz 3 spację.

0

Bardzo dziękuje, rzeczywiście ;D umykało mi to jak kod sprawdzałem. Próbowałem to przedtem inną pętlą zrobić, stąd to i++ pozostało.

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