Yamen Massalha
Yamen Massalha

Reputation: 13

How can resort a string array in C using pointers only

char * players[3]={"Player 1","Player 2","Player 3";
char *p = *players;
char *temp;
for(int t = 0; t < 2; t++)
     {
         temp = *(p+t);
         *(p+t) = *(p+t+1);
         *(p+t+1) = temp;
     }

How can I resort the array using pointers only ? I wan't it to be like this : "Player 2","Player 3", "Player 1"

Upvotes: 0

Views: 78

Answers (1)

Kingsley
Kingsley

Reputation: 14906

It looks like you want to do a left-shift (rotation).
This is a pretty simple operation

  • Keep a pointer to the head
  • For every element, make that spot point to the next element
  • put the head on the tail

The Code:

#include <stdio.h>

void rotateLeft( char **arr, int elements )
{
    // keep a pointer to the head
    char *head = arr[0];

    // shift every element left
    for (int i=0; i<(elements-1); i++)
    {
        arr[i] = arr[i+1];
    }

    // put the head on the tail
    arr[elements-1] = head;
}

// EDIT - rotate without [] notation.
void rotateLeftNoArrayNotation( char **arr, int elements )
{
    // keep a pointer to the head
    char *head = *arr; //arr[0];

    // shift every element left
    for (int i=0; i<(elements-1); i++)
    {
        *(arr+i) = *(arr+i+1); //arr[i] = arr[i+1];
    }

    // put the head on the tail
    *(arr+elements-1) = head; //arr[elements-1] = head;
}

int main( void )
{
    char *players[3] = { "Player 1", "Player 2", "Player 3" };

    for (int i=0; i<3; i++)
        printf( "players[%u] = \"%s\"\n", i, players[i] );

    rotateLeftNoArrayNotation( players, 3 );

    for (int i=0; i<3; i++)
        printf( "players[%u] = \"%s\"\n", i, players[i] );

    return 0;
}

Which gives:

$ ./rotLeft
players[0] = "Player 1"
players[1] = "Player 2"
players[2] = "Player 3"
players[0] = "Player 2"
players[1] = "Player 3"
players[2] = "Player 1"

Upvotes: 1

Related Questions