在C ++中使用Cstrings反转字符串

时间:2018-10-30 16:01:01

标签: c++ for-loop c-strings

我正在尝试接受用户输入,然后将其反转以进行比较。看起来我朝着正确的方向前进,但是我似乎无法弄清楚为什么我的方法只返回一个字母。当我关闭reversedInput时,它应该返回整个Cstring反转。

#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 个答案:

答案 0 :(得分:2)

根本问题是您的条件中的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。请考虑当/如果您将 empty 字符串传递给此函数,将会发生什么情况。 (提示:合法的未签名类型会最大程度地溢出)。

也就是说,这里有很多潜在的问题,特别是有可能超过reversedInput的大小,依靠它是静态的(因此零填充,因此是一个自由终止符),以及修改a的副作用全局(应该是输出参数)。但是核心问题是有条件的问题之一。

答案 1 :(得分:0)

如果要以相反的方式将数组arr的内容存储在全局数组reversedInput中,则一种方法是这种方式,尽管Why Global Variables Should Be Avoided When Unnecessary?

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 */
}

答案 2 :(得分:-1)

假设输入字符串为“ nitendra”,并且您想反转它。您可以反转字符串,只需将第一个字符与最后一个字符交换,然后将第二个字符与第二个最后一个字符交换,依此类推..直到(字符串的长度)/ 2。

x[, value := sapply(seq_len(.N), function(i) 
     paste(value[seq(i)], collapse = "_")), by = group]
x
#   group row_id value
#1:     A      1     a
#2:     A      2   a_b
#3:     A      3 a_b_c
#4:     B      1     d
#5:     B      2   d_e