rajya vardhan
rajya vardhan

Reputation: 1131

Switch every pair of words in a string (“ab cd ef gh ijk” becomes “cd ab gh ef ijk”) in c/c++

Switch every pair of words in a string (“ab cd ef gh ijk” becomes “cd ab gh ef ijk”) in c++ without any library function.

int main(){
char s[]="h1 h2 h3 h4";//sample input
switch_pair(s);
std::cout<<s;
    return 0;
}

char * switch_pair(char *s){
char * pos = s;
char * ptr = s;
int sp = 0;//counts number of space
while(*pos){
    if(*pos==' ' && ++sp==2){ //if we hit a space and it is second space then we've a pair
        revStr_iter(ptr,pos-1);//reverse the pair so 'h1 h2' -> '2h 1h'
        sp=0;//set no. of space to zero to hunt new pairs
        ptr=pos+1;//reset ptr to nxt word after the pair i.e. h3'
    }
    pos++;
}
if(sp==1) //tackle the case where input is 'h1 h2' as only 1 space is there
    revStr_iter(ptr,pos-1);
revWord(s); //this will reverse each individual word....i hoped so :'(
return s;
 }

 char* revStr_iter(char* l,char * r){//trivial reverse string algo
char * p = l;
while(l<r){
    char c = *l;
    *l = *r;
    *r = c;
    l++;
    r--;
} 
return p;
 }


char* revWord(char* s){//this is the villain....need to fix it...Grrrr
char* pos = s;
char* w1 = s;
while(*pos){
    if(*pos==' '){//reverses each word before space
        revStr_iter(w1,pos-1);
        w1=pos+1;
    }
pos++;
}
return s;
}

Input - h1 h2 h3 h4
expected - h2 h1 h4 h3
actual - h2 h1 h3 4h

can any noble geek soul help plz :(((

Upvotes: 1

Views: 1584

Answers (2)

Nocturnal
Nocturnal

Reputation: 683

int Groups = 1; // Count 1 for the first group of letters
for ( int Loop1 = 0; Loop1 < strlen(String); Loop1++)
  if (String[Loop1] == ' ') // Any extra groups are delimited by space
    Groups += 1;

int* GroupPositions = new int[Groups]; // Stores the positions
for ( int Loop2 = 0, Position = 0; Loop2 < strlen(String); Loop2++)
{
  if (String[Loop2] != ' ' && (String[Loop2-1] == ' ' || Loop2-1 < 0))
  {
    GroupPositions[Position] = Loop2; // Store position of the first letter
    Position += 1; // Increment the next position of interest
  }
}

If you can't use strlen, write a function that counts any letters until it encounters a null terminator '\0'.

Upvotes: 1

Jerry Coffin
Jerry Coffin

Reputation: 490208

IMO, what you're working on so far looks/seems a lot more like C code than C++ code. I think I'd start from something like:

  1. break the input into word objects
  2. swap pairs of word objects
  3. re-construct string of rearranged words

For that, I'd probably define a really minimal string class. Just about all it needs (for now) is the ability to create a string given a pointer to char and a length (or something on that order), and the ability to assign (or swap) strings.

I'd also define a tokenizer. I'm not sure if it should really be a function or a class, but for the moment, let's jut say "function". All it does is look at a string and find the beginning and end of a word, yielding something like a pointer to the beginning, and the length of the word.

Finally, you need/want an array to hold the words. For a first-step, you could just use a normal array, then later when/if you want to have the array automatically expand as needed, you can write a small class to handle it.

Upvotes: 2

Related Questions