做。。。虽然不会停止

Do...While won't stop

本文关键字:      更新时间:2023-10-16

所以我正在为一个分配做一个程序,现在我正在尝试获得用户输入并试图使其适合特定的形式。

例如,用户输入的日期格式为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

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

为了适应数组(7个字符长)中的整个日期以及null字符,您需要数组的大小至少为8个元素,并将该大小传递给getline

然而,你最好使用getlinestd::string版本,像这样:

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

现在你不必担心缓冲区溢出

相关文章:
  • 没有找到相关文章