0

次のコードは、最初の 2 つの getlines に対して意図したとおりに機能し、CC 変数を入力した後、getlines をスキップして入力を待機しない無限ループに入ります。

実行例は次のとおりです。

カード所有者名を入力 (または終了): John Doe

CC 番号を入力してください: 1234 1234 1234 1555

// コードは他の cout を出力しますが、getline の入力を待ちません。cout ステートメントを繰り返します。cin.ignore は役に立たないようです または cin.clear()

コード:

 int main(int argc, char* argv[]) {

    char CCName[64];    //cardholder name
    char  CCNumber[16]; //credit card number
    char Expiration[8]; //expiration date 
    float Amount;     


    while (true) {

        /* input processing block */

        //gather card holder name
        cout << "\nEnter card holder name (or quit): ";
        cin.getline(CCName, 64);

        //quit command processing 
        if (strcmp(CCName, "quit") == 1) {
            cout << "\nYou successfully terminated the program\n";
            //~ close(sockfd); //close socket
            exit(EXIT_SUCCESS);
        }

        //gather credit card number
        cout << "\nEnter CC number: ";
        cin.getline(CCNumber, 16);
        //error checking
        if (strlen(CCNumber) != 15 && strlen(CCNumber) != 16) {
            cout << "\nCredit card number must be 15 to 16 digits, try again: ";
            cin.getline(CCNumber,16);
        } 

        //gather expiration date
        cout << "\nEnter expiration: ";
        cin.ignore();
        cin.getline(Expiration, 7);
        //error checking
        if (strlen(Expiration) != 7) {
            cout << "\nExpiration date format mm/yyyy. Try again: ";
            cin.getline(Expiration, 7);
        }

        //gather amount
        cout << "\nEnter amount: ";
        cin >> Amount;
}

   return 0;
}
4

3 に答える 3

0

コードについていくつか提案があります。 1. char 配列のサイズを大きくします。

char CCName[65];    //cardholder name
char  CCNumber[17]; //credit card number

2. if 条件を修正する

if (strcmp(CCName, "quit") == 0) {

3.これを変更します

if (strlen(CCNumber) != 15 && strlen(CCNumber) != 16) {

これで

while (strlen(CCNumber) != 15 && strlen(CCNumber) != 16) {

4. 日付入力については、その有効性をチェックする別の関数を作成できます。

于 2013-11-12T03:44:16.617 に答える
0

あなたの問題は、CCNumberが保持できるよりも多くの文字を与えることです

あなたがするとき

1234 1234 1234 1555 

入力として、実際には16文字ではなく19文字(スペース数)であり、これによりcinに余分な文字が残り、奇妙な動作が発生します。私はそれを修正しました

    cout << "\nEnter CC number: ";
    cin.ignore();
    cin.getline(CCNumber, 16);

入力あり

1234123412341234

そしてその部分はうまくいきました。スペースが必要な場合は、配列のサイズを増やします。また、指摘されているように、ユーザーが完全なデータを提供すると想定しているため、これはあまり安全ではありません。非常に危険な仮定です。

于 2013-11-12T03:44:34.383 に答える
0

cin.getline() の使用は非常に危険です。cin.getline() はキーボードから入力を読み取り、改行 (ユーザーがエンター キーを押したときに生成される) を読み取るときに、改行を null 文字に置き換えます。これがどのようにエラーを引き起こすか見てみましょう。さらに、入力のサイズについて心配する必要があります。これは、あまりにも多くの制限を課すだけであり、ユーザー フレンドリーではありません。代わりに getline(cin,stringName) を使用することをお勧めします。

于 2013-11-12T03:39:55.847 に答える