首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带一个空格的反向字符串

带一个空格的反向字符串
EN

Stack Overflow用户
提问于 2022-04-30 14:19:37
回答 3查看 196关注 0票数 0

我需要反转字符串,但在单词之间只保留一个空格。

例子:

代码语言:javascript
复制
"  na vrh   brda vrbaa   mrdaa!!!   "
"!!!aadrm aabrv adrb hrv an"

代码:

代码语言:javascript
复制
#include <iostream>
#include <string>

std::string ReverseOneSpace(std::string s) {
  std::string str = s;
  int j = 0;
  for (int i = s.length() - 1; i >= 0; i--) {
    // skip spaces
    while (s[i] == ' ' && i >= 0)
      i--;
    while (s[i] != ' ' && i >= 0) {
      str[j] = s[i];
      j++;
      i--;
    }
    // add only one space
    if (s[i] == ' ') str[j] = ' ';
    j++;
    if (i == 0) break;
  }
  return str;
}
int main() {
  std::string s = "  na vrh   brda vrbaa   mrdaa!!!   ";
  std::string str = ReverseOneSpace(s);
  std::cout << "\"" << str << "\"" << std::endl;
  std::cout << "\"" << "!!!aadrm aabrv adrb hrv an" << "\"";
  return 0;
}

产出:

代码语言:javascript
复制
"!aabrv adrb hrv an aa!   " // my output
"!!!aadrm aabrv adrb hrv an" // correct

为什么在字符串反转后我会有一些额外的字符呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-01 13:41:14

另一种解决方案是使用C++库中可用的内容:

  1. 使用std:迎风流无需检查空格。
  2. 使用std:反向将自动反转字符串。

将这些结果结合在一起,将产生以下方案:

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>

std::string ReverseOneSpace(std::string s) 
{
    std::istringstream strm(s);
    std::string word;
    std::string ret;

    // Loop for each word found
    while (strm >> word)
    {
        // Reverse the word 
        std::reverse(word.begin(), word.end());

        // Add reversed word to front of the result string
        ret = word + " " + ret;
    }

    // Remove the excess space at the back
    ret.pop_back();

    return ret;
}

int main() {
  std::string s = "  na vrh   brda vrbaa   mrdaa!!!   ";
  std::string str = ReverseOneSpace(s);
  std::cout << "\"" << s << "\"" << std::endl;
  std::cout << "\"" << str << "\"" << std::endl;
  return 0;
}

输出:

代码语言:javascript
复制
"  na vrh   brda vrbaa   mrdaa!!!   "
"!!!aadrm aabrv adrb hrv an"

请注意,没有检查空格。手动检查空格很容易出错,至少在第一次尝试编写这样的代码时是如此。那么,如果有一些东西(在本例中是std::istringstream)为您检查空间,那么为什么要浪费时间呢?

票数 0
EN

Stack Overflow用户

发布于 2022-04-30 14:38:08

在这两个while循环中,您都超出了界限。变量i最终将是"-1“。

请将while循环中的状态从>=更改为>

其他原因可能是一些设计问题。您不应该用其他语句更改循环主体中的循环变量(此处为i)。

代码语言:javascript
复制
#include <iostream>
#include <string>

std::string ReverseOneSpace(std::string s) {
    std::string str = s;
    int j = 0;
    for (int i = s.length() - 1; i >= 0; i--) {
        // skip spaces
        while (s[i] == ' ' && i > 0)   // ************
            i--;
        while (s[i] != ' ' && i > 0) { // ************ 
            str[j] = s[i];
            j++;
            i--;
        }
        // add only one space
        if (s[i] == ' ') str[j] = ' ';
        j++;
        if (i == 0) break;
    }
    return str;
}
int main() {
    std::string s = "  na vrh   brda vrbaa   mrdaa!!!   ";
    std::string str = ReverseOneSpace(s);
    std::cout << "\"" << str << "\"" << std::endl;
    std::cout << "\"" << "!!!aadrm aabrv adrb hrv an" << "\"";
    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2022-05-01 11:48:14

您也可以尝试我的代码,我使用的是reverse函数,所以不需要从后面循环字符串

代码语言:javascript
复制
#include<iostream>
#include<string>

using namespace std;
std::string ReverseOneSpace(std::string s) {
    bool flagSpace = false;
    bool flagWord = false;

    reverse(s.begin(), s.end());
    std::string result = "";
    for(auto c : s) {
        if (c == ' ') {
            if (flagWord) flagSpace = true;
        } else {
            flagWord = true;
        }

        if (c != ' ') {
            if (flagWord && flagSpace) {
                result += ' ';
                flagSpace = false;
                flagWord = false;
            }
            result += c;
        }
    }
    return result;
}

int main() {
    std::string s = "  na vrh   brda vrbaa   mrdaa!!!   ";
    std::string str = ReverseOneSpace(s);
    std::cout << "\"" << str << "\"" << std::endl;
    std::cout << "\"" << "!!!aadrm aabrv adrb hrv an" << "\"" << std::endl;
    return 0;
}

代码将像这样打印到终端

代码语言:javascript
复制
"!!!aadrm aabrv adrb hrv an"
"!!!aadrm aabrv adrb hrv an"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72069293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档