#include <iostream>
#include <cstring>
usingnamespace std;
void invoer (char ingeven [90])
{
cout << "Give a line text:" << endl;
cin.getline ( ingeven, 90 );
}
void vervangen_en_afdrukken (char ingegeven [])
{
int i,k,l,m;
int waar;
waar = 0;
i = 0;
m = 0;
while (i<strlen(ingegeven))
{
if (!isdigit(ingegeven[i]) && i<strlen(ingegeven)) //als het geen getal is en nog niet aan het einde is
{
while (!isspace(ingegeven[i])); //moet hij blijven lopen en niets veranderen tot de volgende spatie.
{
cout << ingegeven[i];
i++;
}
}
if (isdigit(ingegeven[i])) //als het een getal is en nog niet aan het einde is
{
k=1;
while (waar==0)
{
if (isdigit(ingegeven[i+k]))
k++; //teller plus 1
if (isalpha(ingegeven[i+k]))
{
k++; //teller plus 1
m=1; //zeggen dat alles tot de volgende spatie gewoon moet afgedrukt worden
}
elseif (isspace(ingegeven[i+k])) // als er een spatie is
{
for (l=0;l<k;l++) //de teller bepaalt de grootte van de blok
{
if (m=0) //alles als X afdrukken
cout << 'X';
if (m=1) //alles gewoon afdrukken
cout << ingegeven[i+l];
}
cout << ' ';
waar=1;
i=i+k;
m=0;
}
}
waar=0;
}
else
{
cout << "er is een foute invoer gebeurd";
break;
}
}
}
void main ()
{
char tekst[90];
invoer( tekst );
vervangen_en_afdrukken ( tekst );
cout << endl;
system ("pause");
}
enum ProcessStateEnum
{
eState_Start,
eState_Normal,
eState_LastWasSpace,
eState_IntSeq
};
void process_input(char * szVal)
{
int nLen = strlen(szVal);
ProcessStateEnum eState = eState_Start;
int nSeqStart = -1;
for (int i=0; i<nLen; i++)
{
char ch = szVal[i];
switch (eState)
{
case eState_Start:
if (isdigit(ch))
{
eState = eState_IntSeq;
nSeqStart = i;
continue;
}
if (ch == ' ') eState = eState_LastWasSpace;
else eState = eState_Normal;
break;
case eState_Normal:
if (ch == ' ') eState = eState_LastWasSpace;
break;
case eState_LastWasSpace:
if (ch == ' ') continue;
if (isdigit(ch))
{
eState = eState_IntSeq;
nSeqStart = i;
continue;
}
eState = eState_Start;
break;
case eState_IntSeq:
if (isdigit(ch)) continue;
if (ch == ' ')
{
for (int j=nSeqStart; j<i; j++)
szVal[j] = 'X';
eState = eState_LastWasSpace;
nSeqStart = -1;
continue;
}
nSeqStart = -1;
eState = eState_Normal;
break;
}
}
if (nSeqStart > -1)
{
for (int j=nSeqStart; j<nLen; j++)
szVal[j] = 'X';
}
}
This also takes care of leading or trailing numbers ie [99 red balloons ...] has leading number of 99 which in this function also changes such a number. This function operates directly on the c string - so if you want to keep your original, then you need to make a copy of it and pass to function process_input. Then you may print the resulting c string - which should be what you want.