【问题标题】:newline from user input without pressing enter用户输入的换行符,无需按 Enter
【发布时间】:2019-05-28 09:02:20
【问题描述】:

首先,我应该提到我发现了几个密切相关的问题。例如herehere。但是,我既不想使用printf,也不想使用\n(因为我已经知道它不起作用)。

用户是否可以在不按回车的情况下输入换行符,可能是转义序列?

举个例子:

#include <iostream>
#include <string>

int main () {
    std::string a,b;
    std::cin >> a;
    std::cin >> b;
    std::cout << a << "\n" << b;
}

用户是否可以提供单行输入

hello ??? world 

使得上面的打​​印出来

hello
world

?

【问题讨论】:

  • @L.F.我确实按了一次回车,但只有一次,所以第一个 cin 应该读到 ??? 和第二个,因为它仍在流中
  • 当您输入 Hello World 并在其间添加一个空格时,a 将设置为 "Hello"b 将设置为 "World"。那是你要的吗? ideone.com/bVxZdt
  • 我有义务问:但是为什么?
  • @mch 这就是问题的明显答案,但不幸的是不是我真正想要的。这个例子实际上完全超出了我真正想要的点。我不想解决这个问题,因为已经有了答案......

标签: c++ user-input cin


【解决方案1】:

你可以这样做

std::string a, b;
std::cin >> a>>b;
std::cout

用户可以输入空格。

【讨论】:

  • std::cin &gt;&gt; a&gt;&gt;b;std::cin &gt;&gt; a; std::cin &gt;&gt; b; 完全相同。
  • 嗯,这有点尴尬......我的例子并不是我真正想要的。当然,简单地输入“hello world”就已经生成了正确的输入。我实际上想用一条 get 线读取两行,但现在我意识到这是没有意义的。为混乱道歉......无论如何都感谢您的回答
  • 如果用户想在他们的字符串中包含空格怎么办?
【解决方案2】:

(我假设您不希望用空格分隔字符串。例如,

Foo bar ??? baz qux

应该是两行。)

您无法将流配置为将??? 自动转换为换行符。对于用户输入换行符,他们必须输入换行符,而不是其他任何内容。

你必须自己解析它。 这是一个将 ??? 视为分隔符的示例解析器:

void read_string(std::istream& is, std::string& dest)
{
  std::string str = "";
  for (char c; is.get(c);) {
    switch (c) {
    case '?':
      if (is.get(c) && c == '?') {
        if (is.get(c) && c == '?') {
          dest = str;
          return;
        } else {
          str += "??";
        }
      } else {
        str += "?";
      }
    default:
      str += c;
    }
  }
}

例如输入

? is still one question mark????? is still two question marks???

被解析为两行:

? is still one question mark
?? is still two question marks

live demo

【讨论】:

  • 嗯,这有点尴尬......我的例子并不是我真正想要的。当然,简单地输入“hello world”就已经生成了正确的输入。我实际上想用一条 get 线读取两行,但现在我意识到这是没有意义的。为混乱道歉......无论如何感谢您的回答
  • 我真正想要的是连续两次调用getline 读取用户输入并且用户只需按一次回车。由于那是完全不同的事情,我将保持这个问题不变,也许会打开一个新问题。
  • @foreknownas_463035818 流不会为您进行这种转换 ;-)
  • 我想如果有可能,那么只能通过我正在使用的终端提供的某些功能,将某些转义序列解释为新行。我想我应该在下次问第一个问题之前先喝第一杯咖啡;)
  • @foreknownas_463035818 这超出了 C++ I/O 流的范围。 ;-)
猜你喜欢
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
相关资源
最近更新 更多