2013-04-24 78 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