【问题标题】:How to Output One Word per Line from a String如何从字符串中每行输出一个单词
【发布时间】:2013-12-20 08:03:57
【问题描述】:

我一直在研究我的教授不久前给我们的一个程序,但我遇到了一个逻辑问题,因为我不知道如何准确地做到这一点。我需要在用户输入的句子的每一行输出一个单词。例如,用户输入“Hello World I'm Chris”,程序需要输出: 你好 世界 我是 克里斯

这是我目前所拥有的:

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

int main()
{
  string sentence;
  int length;

  cout << "Enter the sentence now." << endl;
    getline(cin, sentence);

  for(int i = 0; i < sentence.length(); i++)
  {
    if(sentence[i] != '\0')
    {
        cout << sentence[i];
    }
    else if(sentence[i] == '\0')
    {
        cout << endl;
    }

  }

  system("pause");
}

但是,当我运行它时,程序基本上只是输出相同的句子。还有其他方法可以做到这一点吗?非常感谢。

【问题讨论】:

  • 你到底是什么意思?我不知道您是在问您是否希望每个单词都显示在新行上,或者您是否只想要同一个句子。如果您想要相同的句子,那么您的代码不是已经这样做了吗?
  • 顺便说一下,一个'='表示赋值,两个'=='表示等价。
  • @Lemony-Andrew 该程序需要为每一行输出一个单词,如示例所示。目前程序只输出字符串,但我希望它每行输出一个单词。
  • @ThomasMatthews 谢谢,我确实有这个,只是没有正确复制下来。将代码编辑为类似于我所拥有的。
  • @user3097575 你有没有想过,你的程序正在输出正确的答案,但它全部输出到一行上。改变 cout

标签: c++ string visual-studio-2012 word


【解决方案1】:

根据this\0 不代表空格。看来您想要的更像是:

[...]
if(sentence[i] == ' ') cout << endl; // check for whitespace
else cout << sentence[i];
[...]

顺便说一句,由于 Markdown 格式化文本的方式,“每行一个单词”的事情并不清楚,我不得不伪造编辑您的帖子以了解您的确切意思。我认为使用代码标签可以解决这个问题。

【讨论】:

  • 啊,该死的,当我读到“空白”时,我意识到我在句尾使用了空终止符,而不是实际的空白。非常感谢,这是一个漫长的学期,我的逻辑已经付诸东流了。
  • 这将不满足要求,因为句尾的单词不使用空格作为分隔符。
【解决方案2】:

好的,首先使用代码随意添加您之前的输入内容!

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

int main()
{
  string sentence = "Hello World";
  int length;
  string temp = "";

  for(int i = 0; i < sentence.length(); i++)
  {
    temp += sentence[i];
    if(sentence[i] == ' ')
    {
        cout << temp << "\n";
        temp = "";
    }
  }
  std::cout << temp;

  return 0; //*
}
  1. 您的原始代码执行以下逻辑。如果不是文件末尾,则输出当前字符。这样做确保您在每个单词的末尾添加 \n(只是为了让您更轻松地进行调试!您以后可以随时修复)
  2. 上述代码的逻辑就是这样做的。创建一个临时变量,我们将继续添加字母,直到找到空格字符。当我们找到一个空格字符输出临时变量。并重置它,直到句子结束,然后在程序结束时再次输出 temp,因为我们遇到了行尾字符!

【讨论】:

  • @ThomasMatthews 在解释中添加以尝试帮助。
【解决方案3】:

您的程序输出相同的句子,因为您告诉它。

  for(int i = 0; i < sentence.length(); i++)
  {
    if(sentence[i] != '\0')  // If the current char is not the end,
    {
        cout << sentence[i]; // print the character.
    }
    else if(sentence[i] = '\0') // This should be "=="
    {
        cout << endl;
    }

  }

基本上,您将句子中的每个字母打印回std::cout

请在 StackOverflow 中搜索“C++ print word sentence”,因为很多人都发布了有关此作业的问题。

编辑 1:作业的基础
该作业要求您从输入字符串中提取字母以形成一个单词。有很多方法可以做到这一点。在您的教科书或参考手册中搜索std::basic_string 类,看看哪些功能可以帮助您。

有些人从句子中的第一个字母开始,搜索下一个不是字母的字符:

const char valid_letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
sentence.find_first_not_of(valid_letters);

他们使用返回的位置来获取两个位置之间的子字符串(std::string::substr)。

另一种方法是使用循环。如果当前字符是字母,则附加到word 字符串。

再次搜索并查看您可以找到哪些示例。

【讨论】:

  • 我已经搜索了好几次,但是我只找到了关于 C 或 Java 的东西,这两个我都没有经验。'=' 是一个 '==',但是我错误地复制了我的问题的代码。它仍然输出常规句子。
  • 对不起,我的记忆不同:stackoverflow.com/questions/7621727/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
相关资源
最近更新 更多