如果您想知道是否std::istream::getline()
按要求读取了一个满是字符但不是行尾字符的数组,您需要确定存储的字符数(减去终止的空字符)是否与提取的字符数相同。也就是说,以下确定该行上是否有超过 12 个字符(终止 null 需要第 13 个字符):
#include <iostream>
#include <string.h>
int main()
{
char array[13];
if (std::cin.getline(array, 13).gcount() == strlen(array)) {
std::cout << "excess characters on the line\n";
}
}
如果您接下来还想从流中删除多余的字符,您可以使用类似std::cin.ignore(std::numeric_limits<std::streamsize>::max());
. 由于这也被标记为 C,所以我不知道如何使用 C 来执行此操作,但我很确定有一些类似于gcount()
.
实际上,如果在读取字符时没有遇到换行符,更仔细地查看规范std::istream:getline()
实际上会设置(它也会设置没有读取任何字符,但如果在到达文件结尾之前读取了至少一个字符,则不会设置)。这意味着,您还想在忽略多余字符之前清除流,并且您可以工作并且:std::ios_base::failbit
std::ios_base:failbit
std::ios_base::failbit
std::ios_base::failbit
std::ios_base::eof()
#include <iostream>
#include <limits>
#include <string.h>
int main()
{
char array[13];
std::cout << "enter password: ";
while (!std::cin.getline(array, 13) && !std::cin.eof())
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "password is too long: enter max 12 chars: ";
}
std::cout << "the password is '" << array << "'\n";
}
由于std::ios_base::failbit
已设置,您需要先调用clear()
,然后才能将流用于任何事情。