2013-06-12 2 views
4

В приведенном ниже коде, когда я запускаю его, и если я ввел более 30 символов во время выполнения, он не будет читать linesNum1, а не text[].Как обрабатывать лишние символы, читаемые из cin?

Поэтому я думаю, что он хранит дополнительный символ от array1[30] и использует его в linesNum1.

Так как я могу очистить кэш программы, или сделать его cin в linesNum1 и text[] даже если я вошел больше символов, чем array1 может держать?

char array1[30]; 
for (int i = 0; i<30; i++) 
    cin >> array1[i]; 
int linesNum1; 
cin >> linesNum1; 
int linesNum2 = linesNum1*80; 

char text[linesNum2]; 
for (int i = 0; i < linesNum2; i++) 
    cin >> text[i]; 

for (int i = 0; i < linesNum2; i++) 
    cout << text[i]; 
+0

Вы задали совершенно хороший вопрос, маловероятно, что люди будут вас подчинять. – IanPudney

+0

В ответе на этот вопрос есть несколько советов об исключении переполнения входного буфера: http://stackoverflow.com/questions/4895216/testing-buffer-overrun-of-input –

ответ

1

Вам нужно будет промывать stdin буфер для того, чтобы избавиться от возможных дополнительных символов.

Вы можете использовать istream::ignore, чтобы отменить все доступные символы в потоке:

//Will discard everything until it reaches EOF. 
cin.ignore(numeric_limits<streamsize>::max()); 

//Will discard everything until it reaches a new line. 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

Пример:

/* read 30 chars */ 
for (int i = 0; i<30; i++) cin >> array1[i]; 
/* discard all extra chars on the line */ 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
/* clear the stream state flags */ 
cin.clear(); 
cin >> linesNum1; 
... 
+0

Я использую 'using namespace std;' в заголовок моей программы, можете ли вы объяснить этот ответ больше, пожалуйста? –

2

Я считаю, что вы ищете std::cin.ignore(INT_MAX);.

Это будет читать и игнорировать все до EOF. Кроме того, вы, скорее всего, захотите сделать std::cin.clear(); еще до этого, чтобы сбросить поток.

EDIT: Наряду с cin.ignore() является необязательным второй параметр, чтобы добавить в:

std::cin.ignore(INT_MAX,'\n'); 

Что будет игнорировать до конца строки.

Смежные вопросы