【问题标题】:Leaving exactly one whitespace in between words?在单词之间只留下一个空格?
【发布时间】:2016-10-25 06:11:59
【问题描述】:

我有一个程序,它接收一个字符串并对其进行格式化,去掉它的符号并将大小写设置为较低以便可以处理它。

例子:

"Man, this is super trippy!" -> "man this is super trippy"
"YOU are entering a NEW dimension!" -> "you are entering a new dimenstion"

不幸的是,处理某些字符串会导致单词之间出现额外的空格。

例子:

"Wait a minute -- this is too groovy!" -> "wait a minute  this is too groovy"
"TONIGHT -- we DINE IN hell!" -> "tonight  we dine in hell"

注意到后两个示例中的空格了吗?出于某种原因,在使用此处理字符串后:

line.erase(remove(line.begin(), line.end(), toExclude[i]), line.end());
transform(line.begin(), line.end(), line.begin(), tolower);

其中 line.erase 在遍历字符串以删除 char 的特定实例时被调用,而 transform 将整个内容设置为小写。

由于我的程序可以正常工作,直到我得到单词之间带有连字符的字符串,有没有办法确保单词之间的最大空格保持为 1?

【问题讨论】:

  • 根据您提供的代码,您是using namespace std;,即bad habit to get into
  • @QPaysTaxes 我明白了,谢谢,很遗憾,这是教授要求我们这样做的方法,以免收到作业扣分。
  • @QPaysTaxes,这是一个有效的观点,但是如果您在讨论中添加的内容很少,我建议您不要单独说明这一点,因为它无助于答案或讨论导致答案。尽我所能:ameizing,我相信您可以跟踪打印的最后一个字符是什么(空格或否),并避免在某些情况下输出空格。还有一个问题,输入"A B - ! "会发生什么?
  • @user2899162 cmets 的意义不仅仅是为了寻找答案;这是为了以一种(不一定)适合答案的方式帮助提问者,或者这更像是一个提示而不是实际答案。请参阅占位符文本:“使用 cmets 了解更多信息或建议改进
  • 也许您可以将std::unique 与自定义谓词一起使用?

标签: c++ string transform erase


【解决方案1】:

由于我的程序可以正常工作,直到我得到单词之间带有连字符的字符串,有没有办法确保单词之间的最大空格保持在 1?

是的:考虑使用输入字符串流读取输入字符串,而不是使用擦除删除和转换处理输入字符串(我不会发布任何代码,因为这是您的教授要求的:))。

【讨论】:

  • 我尝试这样做,但它使用符号等处理字符串
  • 请将其转换为实际答案; “这里有一个提示”在作为家庭作业时非常有用,但对于稍后查看此问题的其他人来说则不然。
  • ...除非阅读答案的人也在做同样的作业:)