首页 > 解决方案 > 连续两个cin,空格到底会发生什么?

问题描述

cin >> name;
cin >> age;
cout << name << age;

如果我输入一个字符串,然后是一些空格和一个数字,这里到底发生了什么?例如Something 20. 它是否读取Something然后看到空格并且没问题,这是第一行的结尾,因为空格终止了字符串的读取,进入下一个输入并读取20

但我也想更具体一点。可以说当我在控制台输入时,首先Something进入标准输入流,然后存储在缓冲区中,当我按下那个空格时,就像按下回车一样?那Something被提取并分配给name? 然后20我输入的内容就像一个全新的不相关行,因为我之前按了空格,所以它被提取并分配给age?

标签: c++

解决方案


他们将如何被提取

整数通过std::basic_istream::operator::>>提取:

从输入流中提取值

1-4 ) 提取一个可能跳过前面空格的整数值。该值存储到给定的参考值。

此函数的行为类似于 FormattedInputFunction。在构造和检查哨兵对象后,它可能会跳过前导空格,通过调用 std::num_get::get() 提取一个整数值。

字符串通过std::basic_string::operator>>提取:

2 ) 表现为 FormattedInputFunction。在构造和检查可能跳过前导空格的哨兵对象之后,首先使用 str.erase() 清除 str,然后从 is 读取字符并将它们附加到 str,就像通过 str.append(1, c) 一样,直到其中一个以下条件成立:

  • 读取 N 个字符,其中 N 是 is.width() 如果 is.width() > 0,否则 N 是 str.max_size()
  • 文件结束条件出现在流中
  • std::isspace(c,is.getloc()) 对于 is 中的下一个字符 c 为真(此空白字符保留在输入流中)。

FormattedInputFunction中:

如果在此输入流上设置了 ios_base::skipws 标志,则从输入流中提取并丢弃字符,直到满足以下条件之一:

  • 输入流上的下一个可用字符不是空格字符,正如当前输入流中包含的语言环境的 std::ctype 方面所测试的那样。不提取非空白字符。
  • 到达流的末尾,在这种情况下,failbit 和 eofbit 被设置,如果流在这些位之一上出现异常,则抛出 ios_base::failure。

正如 cplusplus.com 的基本输入/输出中所述:

...请注意,使用键盘输入的字符仅在按下 ENTER(或 RETURN)键时才会传输到程序。

...

...cin提取始终将空格(空格、制表符、换行符...)视为要提取的值的终止,因此提取字符串意味着始终提取单个单词,而不是短语或整个句子。

测试

通过 MSVC-v142 编译器使用前导和尾随空格编译和测试您的程序:

            AA           123             some trailing whitespaces

打印出来:

AA123

另请阅读

Stackoverflow:澄清输入/输出流和输入/输出缓冲区的区别

学习 cpp:输入和输出流


推荐阅读