【问题标题】:Reverse a string using Cstrings in C++ [closed]在 C++ 中使用 Cstrings 反转字符串 [关闭]
【发布时间】:2018-10-30 16:01:00
【问题描述】:

我正在尝试获取用户输入并将其反转以便稍后进行比较。看起来我正朝着正确的方向前进,但我似乎无法弄清楚为什么我的方法只返回一个字母。当我 cout 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;
    }

}

【问题讨论】:

  • 您从未为 reversedInput 添加空终止符。
  • @drescherjm OP 不必这样做。目标缓冲区是全局的,并且只使用一次。它是零填充的,所以终结器(虽然很贵)是免费的。不是一个伟大的设计,但它仍然可以工作。
  • 为什么不直接使用std::string?它有 crbegin()crend() 可以满足您的需求。

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


【解决方案1】:

根本问题是您的条件中的i &lt; 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 的大小,依赖于它是静态的(因此零填充,因此是一个免费的终止符),以及修改全局 in第一个位置(应该是一个输出参数)。但核心问题是条件之一。

【讨论】:

    【解决方案2】:

    如果您想将数组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 */
    }
    

    【讨论】:

    • 为什么不使用std::swap
    • True @BradAllred 那就更好了。
    • 也许他们不想修改原始数组?这样就行不通了
    • 是的,@TobySpeight 你是对的。当我使用移动应用程序回答时,我没有进行测试。感谢您纠正我。
    【解决方案3】:

    假设输入字符串是“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]);
            }
        }
    

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多