反转字符串中的每个字符,特殊字符除外(例如“?”)

时间:2013-10-26 04:52:25

标签: c++

例如:你好吗? ----> woh era uoy?

这是我的代码,我得到了它的工作,但问号也在逆转。 我怎样才能使它保持完整?

#include <iostream>
using namespace std;
int main()
{
    string ch;
    while(cin >> ch)
    {
         for(int i = ch.length() - 1; i >= 0; i--)
         {
             cout << ch[i];
         }
         cout << " ";
    }
    return 0;
}

4 个答案:

答案 0 :(得分:2)

您选择的输入法(cin >> ch)会自动将输入拆分为单独的单词。 就像Jerry Coffinanswer所说的那样,你必须跳过标点符号等来找到要交换的字母字符。大概是这样的:

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main()
{
    string ch;
    while (cout << "String? " && cin >> ch)
    {
        cout << "Input:  <<" << ch << ">>\n";
        const char *bp = ch.c_str();
        const char *ep = ch.c_str() + ch.length() - 1;
        const char *sp = ch.c_str();
        while (sp < ep)
        {
            while (sp < ep && (*sp != ' ' && !isalpha(*sp)))
                sp++;
            while (sp < ep && (*ep != ' ' && !isalpha(*ep)))
                ep--;

            char c = *sp;
            ch[sp-bp] = *ep;
            ch[ep-bp] = c;
            sp++;
            ep--;
        }
        cout << "Output: <<" << ch << ">>\n";
    }
    cout << endl;
    return 0;
}

示例对话

String? How are you?
Input:  <<How>>
Output: <<woH>>
String? Input:  <<are>>
Output: <<era>>
String? Input:  <<you?>>
Output: <<uoy?>>
String? Pug!natious=punctuation.
Input:  <<Pug!natious=punctuation.>>
Output: <<noi!tautcnu=psuoitanguP.>>
String?

你可以从这里调整它。我远非声称这是惯用的C ++;在中间使用const char *显示我的C背景。

答案 1 :(得分:1)

从字符串的开头开始,向前扫描直到找到一个字母。从末尾向后扫描,直到找到一个字母。交换它们。继续,直到两个职位相遇。

注意:上面我使用了“字母”,但我真正的意思是“应该颠倒的字符之一”。你没有非常精确地定义哪些角色应该被交换,哪些不应该,但我假设你(或你的老师)有一个合理的具体定义。

答案 2 :(得分:0)

尝试使用数组并扫描每个字母以查看是否有问号。如果有,请将其移动到数组的最后位置。

答案 3 :(得分:0)

简单的解决方案或黑客单独解决此案例。如果有更多案例评论它可以一起解决。

#include <iostream>
using namespace std;
int main()
{
    string ch;
    while(cin >> ch)
    {
        int flag = 0;
        for(int i = ch.length() - 1; i >= 0; i--)
        {
                if(ch[i] != '?')
                        cout << ch[i];
                else
                        flag = 1;
        }
        if(flag)
                cout << "?";
        else
                cout << " ";
    }
    return 0;
}