【问题标题】:Need some help reversing word orders需要一些帮助来反转单词顺序
【发布时间】:2021-03-27 23:48:29
【问题描述】:

嘿,伙计们,我必须取出一串单词并将它们重新排序以在 C++ 中倒退。不是倒着拼写,而是本质上颠倒了句子。我的问题是我必须使用 cin.get() 并且我不断收到一个我似乎无法弄清楚的错误。错误是“没有重载函数的实例与参数列表匹配”它在 cin.get 之后的“get”下说这是我的代码

#include <iostream>
#include <string>

using namespace std;

int main() {
  string str;
  cin.get(str, 1000);

  int n = str.size();
  int i, j = n;

  for (i = n - 1; i >= 0; i--) {
    if (str[i] == ' ') {
      for (int k = i + 1; k < j; k++) {
        cout << str[k];
      }
      cout << " ";
      j = i;
    }
  }

  for (int k = i + 1; k < j; k++) {
    cout << str[k];
  }

  return 0;
}

【问题讨论】:

  • 你想不通的错误是什么?
  • 改用std::cin
  • @Ivan 似乎得到了相同的错误字符串 str; std::cin.get(str, 1000); int n = str.size();整数 i, j = n; for (i = n - 1; i >= 0; i--) {
  • @Ivan 他确实使用了cin,他没有使用cin &gt;&gt; str,但你是对的
  • cin.get(str, 1000); 很可能是std::getline(std::cin, str)

标签: c++ string iostream cin


【解决方案1】:

因为您包含&lt;string&gt; 并且正在使用std::strings,所以我们将使用std::getline()

我们还将使用std::vector 来存储std::strings。 C++ 中的向量是可以在需要时增长的数组。它们可以像数组一样使用[然后是一些],但它们的动态特性使它们更加灵活。如果出于任何(家庭作业)原因您不能使用向量,这仍然可以使用 std::strings 的 C 数组来完成。您只需要选择足够大的容量来处理您可能的用例。并数一数你实际上有多少字。

我的代码有一些变体,您可以通过注释/取消注释来更改它们。有两种获取单词的方法。一个是单独输入的单词,另一个是一行中的所有单词。我也有两种颠倒词序的方法;所以总共有四种不同的代码运行方式。

#include <algorithm>  // std::reverse()
#include <iostream>
#include <sstream>  // std::istringstream
#include <string>
#include <vector>

std::vector<std::string> get_single_words() {
  std::vector<std::string> words;
  for (std::string tmp; std::getline(std::cin, tmp);) {
    if (tmp != "") {
      words.push_back(tmp);
    } else {
      break;  // Get out of loop on empty string (pressing Enter, only)
    }
  }

  return words;
}

std::vector<std::string> get_line_of_words() {
  std::string line;
  std::getline(std::cin, line);
  std::istringstream sin(line);
  std::vector<std::string> words;

  for (std::string tmp; sin >> tmp;) {
    words.push_back(tmp);
  }

  return words;
}

int main() {
  /*
   * Two methods for obtaining words, uncomment only one at a time
   */
  // auto words = get_single_words();
  auto words = get_line_of_words();

  /*
   * Two methods for printing reversed list, uncomment only one at a time
   */
  // Print in reverse by moving backwards through vector
  //
  for (auto riter = words.rbegin(); riter != words.rend(); ++riter) {
    std::cout << *riter << ' ';
  }
  std::cout << '\n';

  // OR by reversing vector and printing normally
  // (first is better for just printing)
  //
  // std::reverse(words.begin(), words.end());
  // for (const auto& word : words) {
  //   std::cout << word << ' ';
  // }
  // std::cout << '\n';

  return 0;
}

【讨论】:

    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2012-02-17
    • 2011-01-13
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多