Перевернуть строку, используя 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]);
}
}