-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

4

1 回答 1

5

cin.getline(expDate, 7), 如果没有找到换行符,最多会提取 6 个字符,并用空字符cin填充 的最后一个元素。expDate那是因为第二个参数只在第一个参数中给出缓冲区的大小,这样它就不会超过缓冲区的末尾。当getline由于达到缓冲区限制而停止提取时,它将失败位设置为真。任何进一步的提取尝试都将立即失败。

要将整个日期(长度为 7 个字符)与空字符一起放入数组中,您需要数组的大小至少为8元素,并将该大小传递给getline.

但是,你最好使用这样的std::string版本getline

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

现在您不必担心缓冲区溢出。

于 2013-04-24T21:11:51.597 回答