Перевернуть строку, используя Cstrings в C++

Я пытаюсь принять пользовательский ввод и отменить его для сравнения позже. Похоже, я иду в правильном направлении, но я не могу понять, почему мой метод возвращает только одну букву. Он должен вернуть всю Cstring в обратном порядке, когда я coutreversedInput.

#include <cstring>
#include <iostream>
#include <stdio.h>
using namespace std;
void reverseString(char arr[100]);
char reversedInput[100];


int main() {

    char input[100];


    cout<<"Please enter a string"<<endl;
    cin.getline(input, 100);
    cout<<"You entered "<<input<<endl;

    reverseString(input);
    cout<<"The reverse is "<<reversedInput<<endl;

    system("pause");
    return 0;
}

void reverseString (char arr[]) {
    int i;
    int j = strlen(arr) - 1;
    char temp;

    for (i = 0; i < j; i++, j--) {
        temp = arr[j];
        //        arr[j];
        reversedInput[i] = temp;
    }

}

3 ответа

Решение

Корень проблемы i < j в твоих условных. По мере того как вы опускаете исходную строку, j в то время как декременты i приращения, в конце концов встречающиеся на полпути вверх и оставляющие вас с половиной не копируемой.

void reverseString(const char arr[]) 
{
    size_t len = strlen(arr);
    for (size_t i = 0; len-- > 0; ++i)
        reversedInput[i] = arr[len];
}

Обратите внимание, избегание вычислений strlen(arr)-1 намеренно Подумайте, что это будет, когда / если вы передадите пустую строку этой функции. (Подсказка: неподписанные типы юридически недопустимы до своего крайнего максимума).

Тем не менее, здесь есть много потенциально беспокоящих, в частности, возможность превышения размера reversedInputполагаясь на то, что он статичен (таким образом, заполнен нулями, так что свободный терминатор), и побочные эффекты изменения глобала в первую очередь (должен быть выходным аргументом). Но основная проблема была одной из условных.

Если вы хотите хранить содержимое массива arr в обратном порядке в глобальном массиве reversedInput тогда есть один способ - почему глобальных переменных следует избегать, когда они не нужны?

void reverseString (char arr[]) {
        for (size_t i = 0, j = strlen(arr); j-- > 0 ; i++) { /* change the condition from i<j to j>=0*/
                reversedInput[i] = arr[j]; /* filling in global array in reverse order */
        }
        reversedInput[i] = '\0'; /* terminate with \0 */
}

Предположим, что входной строкой является "nitendra", и вы хотите перевернуть ее. Вы можете перевернуть строку, просто поменяв местами первый символ с последним символом, затем второй символ со вторым последним символом и т. Д. До (длина строки)/2.

#include <iostream>
    #include <algorithm>
    #include <stdio.h>
    using namespace std;
    void reverseString(char arr[100]);
    char reversedInput[100];


    int main() {

        char input[100];


        cout<<"Please enter a string"<<endl;
        cin.getline(input, 100);
        cout<<"You entered "<<input<<endl;

        reverseString(input);
        cout<<"The reverse is "<<input<<endl;

        system("pause");
        return 0;
    }

    void reverseString (char* arr)
    {
        size_t len = std::strlen(arr);

        for(size_t i=0;i<(size_t)(len/2);++i)
        {
            std::swap(arr[i], arr[len-i-1]);
        }
    }
Другие вопросы по тегам