2013-04-24 3 views
-1

Так что я делаю программу для задания, и на данный момент я пытаюсь получить пользовательский ввод и попытаться сделать его подходящим для определенной формы.Do ... Хотя не останавливается

Например, пользователь должен ввести дату в формате mm/yyyy. Если пользователь не вводит его в этом формате, он просто перемодует пользователя.

до сих пор это мой маленький цикл:

#include <iostream> 
#include <cstring> 
#include <string> 
using namespace std; 

int findSlash(char[], int); 
int findLastEle(char[]); 

int main() { 
//variables 
char expDate[7]; 
int expLast, expEle; 
int expLen; 

do{ 
cout << "Enter experation (form mm/yyyy): "; 
cin.getline(expDate, 7); 
expLen = strlen(expDate); 
expEle = findSlash(expDate, expLen); 
expLast = findLastEle(expDate); 

}while(expEle != (expLast - 4)); 

return 0; 
} 

//findSlash function (finds slash place in array) 
int findSlash(char array[], int arrayLen){ 
int r, dec = 0; 

for(r = 0; r < arrayLen; r++){ 
    if(array[r] == '/'){ 
     break; 
    } 
    else{ 
     dec++; 
    } 
} 

return dec; 
} 

Петля предположит, что только reprompt на данный момент, если «/» не в нужном месте, но цикл вместо этого просто спам заявления COUT и я не Не знаю, почему это так. Любая помощь будет оценен: D

+0

Что вы пробовали? что-то вроде одноэтапной отладки? выводя ваши инварианты цикла и его зависимые данные на каждый шаг? – PlasmaHH

+0

Хорошим началом было бы добавить вывод отладки, который выводит значения, возвращаемые функциями 'findSlash' и' findLastEle'. – LihO

ответ

5

cin.getline(expDate, 7), если он не найдет новую строку разделителя, будет извлекать максимум 6 символов из cin и заполнить последний элемент expDate с нулевым символом. Это потому, что второй аргумент предназначен только для того, чтобы указать размер буфера в первом аргументе, чтобы он не записывался за конец буфера. Когда getline останавливает извлечение, поскольку он достиг предела буфера, он устанавливает бит ошибки в значение true. Любая дальнейшая попытка извлечь будет немедленно сбой.

Чтобы соответствовать всей дате в массиве (длиной 7 символов) вместе с нулевым символом, вам понадобится размер вашего массива не менее 8 элементов и передать этот размер getline.

Однако, вы гораздо лучше использовать версию getlinestd::string так:

string expDate; 
do{ 
    cout << "Enter experation (form mm/yyyy): "; 
    getline(cin, expDate); 
    // ... 
}while(expEle != (expLast - 4)); 

Теперь вам не придется беспокоиться о переполнении буфера.

+0

Спасибо! Исправлена ​​ошибка! – zuto9999

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