c++ - 连续两个cin,空格到底会发生什么?
问题描述
cin >> name;
cin >> age;
cout << name << age;
如果我输入一个字符串,然后是一些空格和一个数字,这里到底发生了什么?例如Something 20
. 它是否读取Something
然后看到空格并且没问题,这是第一行的结尾,因为空格终止了字符串的读取,进入下一个输入并读取20
?
但我也想更具体一点。可以说当我在控制台输入时,首先Something
进入标准输入流,然后存储在缓冲区中,当我按下那个空格时,就像按下回车一样?那Something
被提取并分配给name
? 然后20
我输入的内容就像一个全新的不相关行,因为我之前按了空格,所以它被提取并分配给age
?
解决方案
他们将如何被提取
整数通过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 为真(此空白字符保留在输入流中)。
如果在此输入流上设置了 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:输入和输出流
推荐阅读
- react-native - 在尝试检索 currentLocation 时,我收到错误“无法读取未定义的属性 'getCurrentPosition'”
- regex - 正则表达式: (#) 和 (? 或 & 或 \n) 之间的所有内容
- python - spacy如何重新训练模型?
- python - 限制cartopy正投影的纬度延伸
- google-cloud-data-fusion - Oracle 标准版和实时管道
- python-3.x - 重定向时如何设置window.alert
- javascript - 如何在javascript中访问另一个对象内的嵌套对象?
- angular - C# Core 和 Angular 7。不适用于 JWT 的 SiganlR 授权
- dynamic - 在 LinkedIn 上分享动态内容
- python - 将张量转换为边缘列表