结合使用 cin.getline 和 fgets 时防止缓冲区溢出
Prevent buffer overflow when using cin.getline and fgets in conjugation
问题是字符串太小了。所以溢出的位被分配给下一个字符串。
我最近了解到,在使用 getline 时,我们不应该使用 fflush(stdin) 来丢弃输入流中不需要的序列因为它有未定义的行为。人们建议改用 cin.ignore()。
但是我们应该使用什么来忽略输入流中不需要的序列 fgets?
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main() {
string cpp;
char c1[6];
char c2[5];
// Reading C++ string: GETLINE
getline( cin, cpp);
// Reading C string: CIN.GETLINE
cin.getline( c1, sizeof(c1) );
// cin.ignore(); DOESNT WORK
// fflush(stdin); UNDEFINED BEHAVIOR
// Reading C string: FGETS
fgets( c2, sizeof(c2), stdin);
cout << " " << cpp << '\n' << c1 << '\n' << c2 << '\n';
return 0;
}
您可以使用老式的 c way 来跳过使用 getchar
的行的其余部分。
char c;
while((c = std::getchar()) != '\n' && c != EOF);
问题是字符串太小了。所以溢出的位被分配给下一个字符串。
我最近了解到,在使用 getline 时,我们不应该使用 fflush(stdin) 来丢弃输入流中不需要的序列因为它有未定义的行为。人们建议改用 cin.ignore()。
但是我们应该使用什么来忽略输入流中不需要的序列 fgets?
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main() {
string cpp;
char c1[6];
char c2[5];
// Reading C++ string: GETLINE
getline( cin, cpp);
// Reading C string: CIN.GETLINE
cin.getline( c1, sizeof(c1) );
// cin.ignore(); DOESNT WORK
// fflush(stdin); UNDEFINED BEHAVIOR
// Reading C string: FGETS
fgets( c2, sizeof(c2), stdin);
cout << " " << cpp << '\n' << c1 << '\n' << c2 << '\n';
return 0;
}
您可以使用老式的 c way 来跳过使用 getchar
的行的其余部分。
char c;
while((c = std::getchar()) != '\n' && c != EOF);