在Linux和Windows下混合CIN和Getline
Mixing cin and getline under Linux and Windows
我知道混合CIN和getline的常见问题。我相信这是不同的。
这是程序:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main() {
int a;
string line;
cin >> a;
printf("A is '%d'n", a);
getline(cin, line);
printf("Line is '%s'n", line.c_str());
cout << cin.fail() << cin.eof() << cin.bad() << endl;
}
我也有一个使用istream :: getline编写的版本。我相信在此处给出的所有输入案例中,结果都是相同的。
a.out < test1
A is '1'
'ine is ' abc 2
000
a.out < test2
A is '1'
Line is ' abc 2'
000
其中test1为 $'1 abc 2rn'
(9个字节),test2为 $'1 abc 2n'
(8个字节)。
我没有在Windows下明确进行这些测试,但是我有一个预感,即输出是"意图"的,即与测试2的输出相同。
我的问题是:解释测试1的输出。例如:为什么printf输出损坏;是否存在与线路结尾的解释有关的可移植性问题;如何通过最小的逻辑更改来修复代码。
在Linux下,getline
从输入流中删除n
。但是,它不会删除r
。
carriagar返回( r
)返回光标到当前行的开头。因此,在printf
调用中,当看到r
时,Stdout光标将返回到行的开头。它打印的下一个字符是'
,它覆盖了行上的第一个字符(L
)。
当文件中没有r
时,您看不到此行为。
轻松解决此问题的解决方案:在Linux和Unix下运行时手动检查r
。
相关文章:
- 而循环跳过 cin.getline() 对于 C 字符串
- 重用字符数组和 cin.getline
- 如果用户输入的输入大于 char 数组,则 cin.getline 会跳过输入提醒
- 必须使用 cin.getline() 按回车键两次
- 填充字符数组的最佳方法(获取与cin.getline)
- 递归 cin.getline() 不想要求输入
- 如何阻止 cin.getline() 导致控制台在找不到分隔符时重复获取用户输入?
- 我在使用 cin.getline() 从用户那里获取 3 个字符串并使用指针数组来存储它们时遇到问题
- cin.getline() 不适用于 switch 语句
- C++ 在 switch 语句中,cin.getline 不会分配给 c 字符串变量
- cin.getline() 等待输入
- 为什么cin.getline分配给字符数组,但使用'='不会?
- cin.getline(),而不使用字符串大小
- cin.getline 不使用 switch 语句
- cin.getline()函数在CIN之后无法正常工作
- Cin.Getline(char,int)在循环中被跳过
- C++ cin.getline 只读取一个字符
- CIN / Getline在控制台应用程序中的一行中
- cin.getline()的奇怪行为
- cin.getline()未按预期工作