Если вы хотите выяснить, является ли std::istream::getline()
считанным массивом, полным символов, как требуется, но не символом конца строки, вам необходимо выяснить, совпадает ли количество сохраненных символов (за исключением завершающего нуля) с извлеченнымперсонажи.То есть следующее определяет, есть ли в строке более 12 символов (для завершающего нуля необходим 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()
до того, какВы можете использовать поток для чего угодно.