问:C ++ - 使用类反转字符串(句子和单词)

时间:2018-03-02 21:03:35

标签: c++ visual-studio class visual-c++ c-strings

对于我的代码,我正在尝试创建一个包含两个函数的类:

  1. 显示每个单词反转的cstring

  2. 显示整个cstring reverse

  3. 我的两个测试句是"Hi There""To Be",因此输出为:

    erehT iH
    eB oT
    
    iH erehT
    oT eB
    

    这是我的代码:

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    class cStringType {
    public:
       char sentenceInput[80];  //Member variable
       void reverse_sentence();  //Member function
       void reverse_words();  //Member function
    };  //Bottom of cStringType
    
    int main()
    {
        cStringType sentence1, sentence2;
        //Objects declared of cStringType
    
        cout << "Please enter a sentence!\n" << endl;
        cin.get(sentence1.sentenceInput, 79, '\n');
    
        cin.ignore(80, '\n');
    
        cout << "\nPlease enter another sentence!\n" << endl;
        cin.get(sentence2.sentenceInput, 79, '\n');
    
        cout << "\nThe first sentence reversed: ";
        sentence1.reverse_sentence();
    
        cout << endl;
    
        cout << "The second sentence where each word is reversed: ";
        sentence2.reverse_words();
    
        cout << endl;
    
        cout << endl;
    
        cout << "The first sentence where each word is reversed: ";
        sentence1.reverse_words();
    
        cout << endl;
    
        cout << "The second sentence reversed: ";
        sentence2.reverse_sentence();
    
        cout << endl;
    
        return 0;
    }
    
    void cStringType::reverse_sentence()
    {
        char reverse_sentence;
    
        //Reverse entire sentence using loop
        for (int i = 0; i < strlen(sentenceInput) / 2; i++)
        {
           //Reverse the sentence using the length of the
           //variable in the class
    
           reverse_sentence = sentenceInput[i];
           //First get the user input
           //Set your variable equal to the variable in the class
    
           sentenceInput[i] = sentenceInput[strlen(sentenceInput) - i - 1];
           //Then reverse the characters and word order 
           //Starts from the last character in the array
           //and goes backwards to 0
    
           sentenceInput[strlen(sentenceInput) - i - 1] = reverse_sentence;
           //Set the variable equal to the result
           //sentenceInput is now the reverse of the user input in main
        }
    
        cout << sentenceInput << endl;
        //Output of the new sentence
    }
    
    void cStringType::reverse_words()
    {
        int beginning, end, j = 0;
        char reverse_words;
    
        //Reverse each word separately using loop
        for (int i = 0; i <= strlen(sentenceInput); i++)
            //Get the length of the sentence in the class
        {
            if (sentenceInput[i] == ' ' || sentenceInput[i] == '\0')
                //Check for spaces or null characters
                //This allows only the letters of each word to be
                //reversed, not the entire sentence
            {
                for (beginning = j, end = i - 1;
                    beginning < (i + j) / 2; beginning++, end--)
                    //j is the beginning of the array; increases
                    //i is the end of the array; decreases
                {
                    reverse_words = sentenceInput[beginning];
                    //Set a variable equal to the first 
                    //word in the original user input
    
                    sentenceInput[beginning] = sentenceInput[end];
                    //Set the first letter of a word equal to
                    //the last letter of a word
    
                    sentenceInput[end] = reverse_words;
                    //Set the result equal to the variable
                    //sentenceInput is now the user input where each
                    //word is reversed
                }
            }
    
            j = i + 1;
        }
    
        cout << sentenceInput << endl;
        //Output of the new sentence
    }
    

    当我尝试运行代码时,输​​出变为如下:

    Please enter a sentence!
    
    Hi There
    
    Please enter another sentence!
    
    To Be
    
    The first sentence reversed: erehT iH
    
    The second sentence where each word is reversed: oT eB
    
    
    The first sentence where each word is reversed: There Hi
    
    The second sentence reversed: Be To
    

    我试过修理它,但无济于事。输出永远不会正确。

    有没有办法解决这个问题?或者更好的是,简化代码?我认为问题在于函数中的代码。

2 个答案:

答案 0 :(得分:1)

您的代码的主要问题是它为两个转换使用相同的缓冲区。换句话说:你正在翻转你已经完全逆转的同一个字符串中的单词。因此,您需要使用原始字符串的另一个副本来独立完成这些操作。

关于简化代码,您需要定义一个函数,该函数会在给定指针和大小或beginend指针的情况下反转字符串。然后,您可以在整个字符串或搜索空格字符时找到的每个单词上使用此函数:

char *begin = sentenceInput; //points to the beginning of the word
char *end = sentenceInput + strlen(sentenceInput);
for (char *it = begin; it != end; ++it)
    if (*it == ' ') {
        reverse(begin, it);
        begin = it + 1;
    }
reverse(begin, end); //reverse the last word

reverse函数可以是std::reverse,可以在上面的代码和整个字符串中使用,如下所示:

std::reverse(sentenceInput, sentenceInput + strlen(sentenceInput))

或者您可以创建类似的功能:

void reverse(char *begin, char *end)
{
    --end; //point to the last character instead of one-past-last
    while (begin < end)
        std::swap(*begin++, *end--);
}

答案 1 :(得分:0)

我建议使用堆栈,这是一种看待它的自然方式。

所以

#include <stack>

然后功能就像那样

void cStringType::reverse_words()
{
int beginning, end, j = 0;
char reverse_words;

stack<char> lastWord;
//Reverse each word separately using loop
for (int i = 0; i <= strlen(sentenceInput); i++)
    //Get the length of the sentence in the class
{
    if (sentenceInput[i] == ' ' || sentenceInput[i] == '\0')
        //Check for spaces or null characters
        //This allows only the letters of each word to be
        //reversed, not the entire sentence
    {
        //we want to print the last word that was parsed
        while(!lastWord.empty())
        {
            //we print in the reverse order the word by taking off the stack char by char
            cout<< lastWord.top();
            lastWord.pop();
        }
        cout<<" ";
    }
    //if the letter is not space or end of string then push it on the stack
    else
        lastWord.push(sentenceInput[i]);
    j = i + 1;
}

cout << sentenceInput << endl;
//Output of the new sentence
}