Создание сообщения об ошибке, если пользователь вводит слишком много символов - PullRequest
0 голосов
/ 18 октября 2019

Я довольно новичок в кодировании, поэтому прошу прощения, если это тривиально. Я должен создать сообщение об ошибке, когда пользователь вводит больше символов, чем мой массив const int SIZE2, который составляет 20 символов. Мой массив называется major:

>cout << "Enter your major: " << endl << endl;
>48         cin.width(SIZE2);
>49         cin.get(major,SIZE2, '\n');
>50         majorLength = strlen(major);
>51         
>52         if(majorLength > SIZE2)
>53         {   
>54             cout << "Too many characters, Enter major again: " << endl;
>55             cin.get(major, SIZE2, '\n');
>56             cin.ignore(100, '\n');
>57          
>58         }

Он просто компилируется, но пропускает мой оператор if.

1 Ответ

1 голос
/ 18 октября 2019

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;
}

Демо

...