-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ヌル文字で埋めます。これは、2 番目の引数が最初の引数のバッファーのサイズのみを指定するためのものであり、バッファーの末尾を超えて書き込まれないためです。getlineバッファ制限に達したために抽出を停止すると、フェイル ビットが true に設定されます。それ以上抽出しようとすると、すぐに失敗します。

null 文字とともに日付全体 (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 に答える