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

C++ 将字符串中的每个字符反转,特殊字符除外(例如“?”),c++,C++,例如:你好吗?----->哦,是什么 这是我的代码,我成功了,但问号也颠倒了。 我怎样才能使它保持完整 #include <iostream> using namespace std; int main() { string ch; while(cin >> ch) { for(int i = ch.length() - 1; i >= 0; i--) { cout <<

例如:你好吗?----->哦,是什么

这是我的代码,我成功了,但问号也颠倒了。 我怎样才能使它保持完整

#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;
}
#包括
使用名称空间std;
int main()
{
弦ch;
而(cin>>ch)
{
对于(int i=ch.length()-1;i>=0;i--)
{

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

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

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

您选择的输入法(
cin>>ch
)自动将输入拆分为单独的单词。 正如他在书中所说,你必须跳过标点符号等,找到要交换的字母字符。大致如下:

#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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
弦ch;
while(cout>ch)
{

不能用简单的解决方案或黑客单独解决这个问题。如果有更多的问题,请评论,让我们一起解决

#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;
}
#包括
使用名称空间std;
int main()
{
弦ch;
而(cin>>ch)
{
int标志=0;
对于(int i=ch.length()-1;i>=0;i--)
{
if(ch[i]!='?')

如果在字符串中间存在标点怎么办?
#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;
}