2013-04-24 102 views
-1

所以我正在做一個任務的程序,此刻我正在嘗試獲取用戶輸入並嘗試使其適合某種形式。做...雖然不會停止

例如,用戶需要輸入格式爲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; 
} 

環路是假設只是重新提示的那一刻,如果「/」是不是在正確的位置,但在循環而不是僅僅修建垃圾的COUT聲明,我不不知道爲什麼要這樣做。任何幫助,將不勝感激:d

+0

你有什麼試過?像單步調試?每步輸出循環不變量及其相關數據? – PlasmaHH 2013-04-24 21:11:17

+0

好的開始是添加調試輸出,它會輸出從'findSlash'和'findLastEle'函數返回的值。 – LihO 2013-04-24 21:11:44

回答

5

cin.getline(expDate, 7),如果它沒有找到一個換行分隔符,將cin提取最多6個字符,並以空字符填補expDate最後一個元素。這是因爲第二個參數意味着只給出第一個參數中緩衝區的大小,以便它不會超過緩衝區的末尾。當getline由於已達到緩衝區限制而停止提取時,它會將失敗位設置爲true。任何進一步的提取嘗試都會立即失敗。

要將整個日期與空字符一起填充到數組中(長度爲7個字符),您需要使用至少8元素,並將該大小傳遞給getline

但是,你就要去使用std::stringgetline像好多了:

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

現在,您不必擔心緩衝區溢出。

+0

非常感謝!快速修復循環! – zuto9999 2013-04-24 21:17:40