Jeśli cały tekst ma być podzielony na wersy, tzn. enter ma być po każdej całkowitej wielokrotności 'miejsce', to tamten sposób w obecnej formie nie przejdzie, bo znajduje tylko ostatnią spację w całym tekście.
Sposób na rozwiązanie problemu może być kilka, zależy jednak czego oczekujesz obecnie od specyficznego źródła danych, np. co z parametrem miejsce=10 dla tekstu:
?
na 10 miejscu nie ma spacji, cofa się do pierwszej napotkanej, czyli do drugiego znaku.
Wstawia enter, efekt:
A teraz gdzie ma być następny znak nowej linii, 10 znaków po poprzednim (lub wcześniej jeśli nie ma tam spacji), czy na 2*miejsce (20 znak)?
Może warto byłoby już pomyśleć nad końcowym efektem, z tym przenoszeniem czy ucinaniem, jeśli dużo trzeba będzie zmieniać.
Jednak sposoby są takie (w pseudokodzie):.
1.
leci znak po znaku od początku
Kod: Zaznacz cały
i=0
spacja=-1
miejsce= jakas wartosc;
for(i=0; i< długość_stringu; i++)
{
if(zdanie[i]==' ') spacja=i;
if((i % miejsce)==0 && zdanie[i]!=10) // kod znaku nowej linii w ascii to 10. Można też: zdanie[i]!='\n'
{
zdanie[i]=32
}
}
% to modulo, reszta z dzielenia. W skrócie pętla leci po stringu, wyłapując spacje, a kiedy natrafi na wielokrotność 'miejsce', to wstawia enter w ostatniej spacji (pod warunkiem, że już tam entera nie wstawiono).
2. sposób
Kod: Zaznacz cały
x=(dlugosc_stringu/miejsce)+1 // x - Na ile całkowitych porcji o długości "miejsce" można pociąć tekst
for(i=0; i<x; x++) // iteruje po każdej takiej porcji o długości "miejsce"
{
spacja = -1;
for(j=i*miejsce, j< (i+1)*miejsce; j++) // iteruje po wszystkich znakach w danej porcji
{
if(zdanie[i]==' ') spacja=i;
}
... // ciag instrukcji zwiazanych ze wstawianiem znaku nowej linii.
// W zmiennej 'spacja' jest pozycja ostatniej spacji, bądź -1,
//jeśli w danej porcji o długości "miejsce" spacji nie wykryto.
}
3. sposób, opisowo: możesz sprawdzać string od tyłu, znak po znaku, w ten sposób unikniesz cofania - jeśli nie będzie spacji na zadanej n-tej pozycji od końca, to i tak sprawdzasz (n+1)-tą pozycję, aż do początku.