Как можно преобразовать строковый массив в C, используя только указатели - PullRequest
0 голосов
/ 11 декабря 2018
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;
     }

Как я могу прибегнуть к массиву, используя только указатели?Я не хочу, чтобы это было так: «Игрок 2», «Игрок 3», «Игрок 1»

1 Ответ

0 голосов
/ 11 декабря 2018

Похоже, вы хотите сделать сдвиг влево (вращение).
Это довольно простая операция

  • Держать указатель на голову
  • Для каждого элемента сделайте эту точку на следующем элементе
  • поместитеголова на хвосте

Код:

#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;
}

Что дает:

$ ./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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...