输入越界的时候会发生什么
type
Post
summary
status
Published
author
slug
input-out-of-bounds
tags
C++
updateAt
Jul 20, 2023 02:49 PM
thumbnail
date
Jul 19, 2023
对于代码:
#include <iostream>
int main()
{
using namespace std;
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cout << "Enter ur name:\\n";
cin.getline(name, ArSize);
cout << "Enter ur favorite dessert:\\n";
cin.getline(dessert, ArSize);
cout << "I have some delicious " << dessert;
cout << " for u, " << name << ".\\n";
return 0;
}
当第一次直接输入
Peeeeeeelson Niiiiiii
时,直接跳过了第二次输入,输出的内容如下:Enter ur name:
Peeeeeeelson Niiiiiii
Enter ur favorite dessert:
I have some delicious for u, Peeeeeeelson Niiiii.
使用
cin.getline
函数读取输入时,如果输入的字符数超过了指定的缓冲区大小,它会将超出部分截断并存储在缓冲区中。但是,它会在缓冲区中留下换行符(\\n
)。
在第一次使用 cin.getline
读取输入 Peeeeeeelson Niiiiiii
时,存储在 name 数组中的内容为 Peeeeeeelson Niiiiiii\\n
。换行符('\n')被视为输入的一部分并存储在缓冲区中。
在第二次使用 cin.getline
读取输入 Enter ur favorite dessert:\\n
时,getline
函数会立即读取到已在缓冲区中留下的换行符('\n'),并将其视为一个空行,然后将结果存储在 dessert
数组中。这就解释了为什么程序跳过了第二次输入。
为了解决这个问题,你可以在两次输入之间添加额外的 cin.ignore()
语句,它可以清除缓冲区中的换行符,使输入流处于正确的状态:cout << "Enter ur name:\\n";
cin.getline(name, ArSize);
cin.ignore(); // 清除缓冲区中的换行符
cout << "Enter ur favorite dessert:\\n";
cin.getline(dessert, ArSize);
这样可以确保正确获取用户的输入,并避免出现意外行为。