输入越界的时候会发生什么

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);
这样可以确保正确获取用户的输入,并避免出现意外行为。