期间卸妆后的双倍空间

时间:2012-04-22 23:12:58

标签: c++ string

  

在单词处理器之前学习如何键入的人通常会在结束句子之后添加两个空格。编写一个函数singleSpaces接受一个字符串并返回该字符串,在“。”之后出现两个空格。改变单个空格。)

这就是我所拥有的;我做错了什么?

#include <cmath>
#include <iostream>
using namespace std;



string forceSingleSpaces1 (string s) {
    string r = "";
    int i = 0;
    while (i < static_cast <int> (s.length()))  {
        if (s.at(i) != ' ')  {
            r = r + s.at(i);
            i++;
        } else  {
            r +=  ' ';
            while (i < static_cast <int> (s.length()) && s.at(i) == ' ')
                i++;
        }
    }
    return r;
}

3 个答案:

答案 0 :(得分:2)

在你的作业中,有关于dot之后的双重空格,而不是文本中的所有双重空格。所以你应该修改你的代码

  • 等待'。'而不是'',
  • 何时'。'截获然后添加它,之后添加任何单个空格

您可以将此代码视为两个状态机:

状态1 - 当你循环任何非''时。字符,在这种状态下,您的代码会将所有找到的内容添加到结果中

状态2 - 是'。'找到了,在这种状态下你使用不同的代码,你添加'。'结果和确切的单一空间(如果找到任何一个)

这样你就可以将你的问题分成两个子问题

[edit] - 用修改提示替换了源代码

答案 1 :(得分:2)

您可以(重新)使用更通用的函数,将字符串中给定字符串的出现替换为另一个字符串,如here所述。

#include <string>
#include <iostream>

void replace_all(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = 0;
    while((start_pos = str.find(from, start_pos)) != std::string::npos) {
        str.replace(start_pos, from.length(), to);
        start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
    }
}

int main() {
    std::string text = "I'm old.  And I use two spaces.  After periods.";
    std::string newstyle_text(text);
    replace_all(newstyle_text, ".  ", ". ");
    std::cout << newstyle_text << "\n";

    return 0;
}

更新

如果您不害怕处于最前沿,可以考虑使用TR1 regular expressions。这样的事情应该有效:

#include <string>
#include <regex>
#include <iostream>

int main() {
    std::string text = "I'm old.  And I use two spaces.  After periods.";
    std::regex regex = ".  ";
    std::string replacement = ". ";
    std::string newstyle_text = std::regex_replace(text, regex, repacement);

    std::cout << newstyle_text << "\n";

    return 0;
}

答案 2 :(得分:0)

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

//1. loop through the string looking for ".  "
//2. when ".  " is found, delete one of the spaces
//3. Repeat process until ".  " is not found.  

string forceSingleSpaces1 (string str) {
    size_t found(str.find(".  "));
    while (found !=string::npos){
        str.erase(found+1,1);
        found = str.find(".  ");
    }

    return str;
}

int main(){

    cout << forceSingleSpaces1("sentence1.  sentence2.  end.  ") << endl;

    return EXIT_SUCCESS;
}