can someone see the fault in my program?

i was making a program for my exam but if i run i can type a line of text but after that if u click on enter it does nothing.

the program need to do:
if there are between 2 spaces only numbers, every number need to change in 'X'

example:
Sim66 his pasword is: 56543 --> Sim66 his pasword is: XXXXX
and:
44sim sim44 444 44sim44 --> 44sim sim44 XXX 44sim44

// Programme van Sim Leys

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <cstring>
using namespace 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
                                }
                                else if (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");
}
Last edited on
Could you put that in code tags, it really does make it easier to read
//Hope this helps :) this is not error free, but a little bit simple than you're code.

#include <iostream>
#include <cstring>
using namespace std;

void invoer (char ingeven [90])
{
cout << "Give a line text:" << endl;
cin.getline ( ingeven, 90 );
}

void vervangen_en_afdrukken (char ingegeven [])
{int i=0;

while(i<strlen(ingegeven))
{

if(isspace(ingegeven[i]))
{ cout<<" ";
int k=i+1;
while(isdigit(ingegeven[k])&&k<strlen(ingegeven))
{ k++;
if(isspace(ingegeven[k]))
{
for (int j=1;j<k-i;j++)cout << "x";

i=k-1;

}

}

}
else
cout<< ingegeven[i];
i++;
}

}


void main ()
{
char tekst[90];
invoer( tekst );
vervangen_en_afdrukken ( tekst );
cout << endl;
system ("pause");
}
I think you may need a state machine to solve:

try this.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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.
the problem is that whe may not use state machine solve, but ty

@ octa,

your reasoning is much bether then mine. i used it, made the errors (like what if the last letters are digits?)

thx to this fast replys

grtz

Topic archived. No new replies allowed.