1

在文字处理器之前学习如何打字的人通常在句号结束后添加两个空格。编写一个函数 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;
}
4

3 回答 3

2

在您的作业中,讨论了点后的双空格,而不是文本中的所有双空格。所以你应该修改你的代码,以便它

  • 等待一个'.'而不是'',
  • 什么时候 '。' 被拦截然后添加它,然后添加任何单个空格

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

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

状态 2 - 是 '.' 找到,并且在这种状态下您使用不同的代码,您添加“。” 结果并吃掉那个完全单一的空间(如果找到任何一个)

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

[编辑] - 用修改提示替换源代码

于 2012-04-22T23:30:42.930 回答
2

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

#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 正则表达式。像这样的东西应该工作:

#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;
}
于 2012-04-23T00:43:40.737 回答
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;
}
于 2012-04-22T23:55:39.977 回答