Переупорядочить массив в обратном направлении с помощью указателей - PullRequest
2 голосов
/ 23 декабря 2011

Я пытаюсь изменить порядок строки C в обратном направлении с помощью указателей. В моей программе я беру строку, а затем в циклах for переставляю ее.

Например, если я введу Thomas, он должен вернуть samohT с помощью указателей.

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main()
{
    int lengthString;

    char name[256];
    cout << "Please enter text: ";
    cin.getline(name, 256);
    cout << "Your text unscrambled: " << name << endl;

    lengthString = strlen(name);

    cout << "length " << lengthString << endl;

    char* head = name;

    char* tail = name;

    for (int i = 0; i < lengthString; i++)
    {
       //swap here?

    }

    for (int j = lengthString - 1; j > -1; j--)
    {
        //swap here?
    }

    return 0;
}

Чего мне не хватает в этих двух циклах?

Ответы [ 5 ]

4 голосов
/ 23 декабря 2011

Вы, кажется, пишете смесь C и C ++, но ваше назначение требует строки C. Я бы написал так:

char str[] = "Thomas";
size_t head = 0;
size_t tail = strlen(str)-1;
while (head<tail)
{
    char tmp = str[head];
    str[head] = str[tail];
    str[tail] = tmp;
    head++;
    tail--;
}

Вы можете написать этот алгоритм с меньшим количеством переменных, но я лично считаю, что эту версию легче читать, понимать и проверять.

Если вы предпочитаете использовать указатели, а не индексы, то это выглядит так:

char str[] = "Thomas";
char *head = str;
char *tail = str + strlen(str) - 1;
while (head<tail)
{
    char tmp = *head;
    *head = *tail;
    *tail = tmp;
    head++;
    tail--;
}

Две версии практически неразличимы.

4 голосов
/ 23 декабря 2011

В C ++ вы можете просто использовать std :: reverse

Например:

std::string str = "Thomas";
std::reverse(str.begin(), str.end());
2 голосов
/ 23 декабря 2011
for (int i = 0; i < (lengthString / 2); ++i)
{
    char tempChar = name[i];
    name[i] = name[lengthString - i - 1];
    name[lengthString - i - 1] = tempChar;
}

РЕДАКТИРОВАТЬ:

char* head = name;
char* tail = name + lengthString - 1;
while (head<tail)
{
    char tempChar = *head;
    *head = *tail;
    *tail = tempChar;
    ++head;
    --tail;
}
0 голосов
/ 23 декабря 2011

Если вы хотите использовать циклы for в своей программе, вы можете сделать это, например, так:

char reverse[256] = {0};
int reverseIndex = 0;

for (int i = lengthString - 1; i >= 0; i--)
{
  reverse[reverseIndex++] = name[i];
}
0 голосов
/ 23 декабря 2011
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>

int main() {
    std::cout << "Please enter text: ";
    std::string s;
    std::getline(std::cin, s);
    std::cout << "Your text unscrambled: " << s << '\n';
    std::reverse(s.begin(), s.end());
    std::cout << "Your text scrambled: " << s << '\n';
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...