需要一些帮助来颠倒单词顺序

Need some help reversing word orders

提问人:zach fisherman 提问时间:3/28/2021 最后编辑:sweenishzach fisherman 更新时间:3/29/2021 访问量:84

问:

嘿,伙计们,我必须取一串单词并将它们重新排序为在 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;
}
C++ 字符串 IOSTREAM CIN

评论

0赞 takendarkk 3/28/2021
你无法弄清楚的错误是什么?
1赞 Ivan 3/28/2021
请尝试std::cin
0赞 zach fisherman 3/28/2021
@Ivan似乎得到相同的错误字符串 str;std::cin.get(str, 1000);int n = str.size();int i, j = n;for (i = n - 1; i >= 0; i--) {
1赞 TruVortex_07 3/28/2021
@Ivan他确实使用,他不使用,但你是对的cincin >> str
0赞 Igor Tandetnik 3/28/2021
cin.get(str, 1000);应该是std::getline(std::cin, str)

答:

-1赞 sweenish 3/28/2021 #1

因为你包含并使用了 s,所以我们将使用 .<string>std::stringstd::getline()

我们还将使用 a 来存储 s。C++ 中的向量是可以在需要时增长的数组。它们可以像数组一样使用,但它们的动态特性使它们更加灵活。如果由于任何(家庭作业)原因您不能使用向量,这仍然可以使用 s 的 C 数组来实现。您只需要选择足够大的容量来处理可能的用例。并计算您实际有多少个单词。std::vectorstd::stringstd::string

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

#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;
}