iostream.get()
(здесь вызывается как cin.get()
) читает точное количество байтов и затем завершается. В вашем случае он никогда не будет считывать более SIZE2
байтов в major
;в результате if(majorLength > SIZE2)
всегда будет ложным. Кроме того, если вы введете слишком много байтов, major
будет иметь только первые 20 - остальные усекаются. (FWIW, ваш код сейчас соответствует только 19 символам.)
Обратите внимание, что вам , вероятно, не следует пытаться сделать это - на самом деле нет хорошего способа проверить длинупоток, прежде чем читать его, и если вы решите просто прочитать все это и , то проверить его размер, вы рискуете переполнить ваш буфер - при условии, что он фиксированный размер.
Вы можете,однако, определите, пуст ли буфер после чтения или нет. Чтобы определить, есть ли еще какие-либо входные данные в буфере, кроме SIZE2
, вы можете захватить один символ с помощью std::cin.get()
и затем изучить этот символ. Если символ \n
, это означает, что в буфере больше не было ввода;если это не так, это означает, что в символьном буфере слишком много входных данных. Это также сработает, если вход полностью пустой.
#include <iostream>
int main () {
int SIZE2 = 20;
char str[SIZE2];
char c;
std::cin.get (str, SIZE2+1); // get c-string of 20 chars
std::cin.get(c); //get last buffer character
if(c != '\n') {
std::cout << "bad input!" << std::endl;
}
std::cout << str << std::endl;
return 0;
}
Демо