getline 函数中的缓冲区清理
buffer cleaning in getline function
我知道 cin.getline() 函数不会清理缓冲区,例如在程序下面的代码中跳过第 4 行:
char name[10];
char id[10];
std::cin >> name;
std::cin.getline(id,10);
std::cout << name << std::endl;
std::cout << id << std::endl;
输出(如果我输入“Meysam”作为名称变量):
Meysam
所以因为 cin.getline() 不清理缓冲区所以我们不能输入 id 变量但是如果我们像下面那样使用两个 cin.getline() 我们可以输入 name 和 id变量。
char name[10];
char id[10];
std::cin.getline(name,10,'\n');
std::cin.getline(id,10,'\n');
std::cout << name << std::endl;
std::cout << id << std::endl;
这是输出(我们输入 Meysam 和 12345 作为名称和 ID):
Meysam
12345
但这是为什么呢?
我的意思是因为 cin.getline() 不清理缓冲区,我们应该能够输入名称变量,但是程序应该跳过下一个用于 id 的 cin.getline(),因为缓冲区已经被前面的cin.getline()填充了。NO?
我想知道我哪里没理解正确
谢谢。
std::cin >> name;
将从输入中读取直到找到分隔符,通常是 space 或 newline
个字符,但分隔符 将留在输入流中,因此下一次调用 getline
会读取 newline
字符和 returns 一个空行,从而有效地清除 id
变量。
第二个程序有效,因为 getline
提取了 newline
分隔符,因此下一次调用看不到它并等待输入。
您可以在 cppreference 上看到更好的解释(请参阅“注释”部分。)
在第一种情况下,cin>>name
不会消耗换行符,它仍然存在于缓冲区中。
第四行没有被跳过,而是 cin.getline()
读取缓冲区中的 \n
并停止进一步读取作为 \n 中 getline 的默认分隔符。因此,id 仅包含换行符。
在第二种情况下,cin.getline()
读取整行并在使用换行符后停止。现在缓冲区中没有任何内容,因此下一个 cin.getline()
读取您的 ID。
我知道 cin.getline() 函数不会清理缓冲区,例如在程序下面的代码中跳过第 4 行:
char name[10];
char id[10];
std::cin >> name;
std::cin.getline(id,10);
std::cout << name << std::endl;
std::cout << id << std::endl;
输出(如果我输入“Meysam”作为名称变量):
Meysam
所以因为 cin.getline() 不清理缓冲区所以我们不能输入 id 变量但是如果我们像下面那样使用两个 cin.getline() 我们可以输入 name 和 id变量。
char name[10];
char id[10];
std::cin.getline(name,10,'\n');
std::cin.getline(id,10,'\n');
std::cout << name << std::endl;
std::cout << id << std::endl;
这是输出(我们输入 Meysam 和 12345 作为名称和 ID):
Meysam
12345
但这是为什么呢? 我的意思是因为 cin.getline() 不清理缓冲区,我们应该能够输入名称变量,但是程序应该跳过下一个用于 id 的 cin.getline(),因为缓冲区已经被前面的cin.getline()填充了。NO? 我想知道我哪里没理解正确 谢谢。
std::cin >> name;
将从输入中读取直到找到分隔符,通常是 space 或 newline
个字符,但分隔符 将留在输入流中,因此下一次调用 getline
会读取 newline
字符和 returns 一个空行,从而有效地清除 id
变量。
第二个程序有效,因为 getline
提取了 newline
分隔符,因此下一次调用看不到它并等待输入。
您可以在 cppreference 上看到更好的解释(请参阅“注释”部分。)
在第一种情况下,cin>>name
不会消耗换行符,它仍然存在于缓冲区中。
第四行没有被跳过,而是 cin.getline()
读取缓冲区中的 \n
并停止进一步读取作为 \n 中 getline 的默认分隔符。因此,id 仅包含换行符。
在第二种情况下,cin.getline()
读取整行并在使用换行符后停止。现在缓冲区中没有任何内容,因此下一个 cin.getline()
读取您的 ID。