所以我正在为一个作业制作一个程序,目前我正试图让用户输入并尝试使其适合某种形式。
例如,用户输入格式为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 :(得分:5)
cin.getline(expDate, 7)
,如果找不到换行符分隔符,则会从cin
中提取最多6个字符,并使用空字符填充expDate
的最后一个元素。那是因为第二个参数只是在第一个参数中给出缓冲区的大小,这样它就不会写入缓冲区的末尾。当getline
因为已达到缓冲区限制而停止提取时,它会将失败位设置为true。任何进一步的提取尝试都会立即失败。
要使数组中的整个日期(长度为7个字符)与空字符一致,您需要将数组的大小设置为至少8
个元素,并将该大小传递给{{ 1}}。
但是,您最好使用getline
std::string
这样的版本:
getline
现在您不必担心缓冲区溢出。