1

私は最終試験に向けて勉強している C++ の初心者です。私は2つの方法でプログラムを書きました。最初のコードは を使用してcin.getline()おり、正しく動作しません。2 番目のコードはcin.get()and cin >>and and を使用して、すべてを正しく実行します。

私は何が欠けていますか?例 1 の状況で、残りの入力プロンプトをスキップしてから、役に立たない数字を入力するのはなぜですか?

本質的に、およびcin.getline(ARRAYNAME,ARRAYSIZE)の仕事をすることになっていませんか? 文字まで抽出し、 に配置し、最後にa を追加し、それ以降はデフォルトで ...に到達するまですべてスキップすることで機能しません か?setw(n)cin.get(ARRAYNAME,ARRAYSIZE)cin.ignore(int,char)cin.getline(ARRAYNAME,ARRAYSIZE)ARRAYSIZE-1ARRAYNAME\0\n

編集:もう少し背景を説明するために、この例は私の教科書の前半(第3章と第4章)からのものです。私はその進歩をたどり、初期の忘れやすい概念について記憶を新たにしたかったのです。string文字列、ライブラリ、stringクラスについては後で (第 10 章)復習します。

助けてくれてありがとう!

-- ah08

PS ISBN 番号は、ISBN-13 (13 個の数字、4 つのハイフン) を保持するように設定されています。

ユーザーが書籍情報を入力する - 例 1 (正しく機能しない)

/*
In this version, I use "cin.getline(ARRAYNAME,ARRAYSIZE)",
but when I input a string with a length that's larger than the ARRAYSIZE,
weird things happen.

I include the cin.ignore(int,'\n') as a safety measure...
but is it really necessary?
*/

//BEGIN PROGRAM CODE

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    char date[9];
    char ISBN[18];
    char bookTitle[31];
    int quantity;
    double unitPrice;

    cout << "Please enter the following information.\n";

    // Input Date
    cout << "Date (in MM/DD/YY format): ";
    cin.getline(date,9);

    // Display Date
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << date << endl;
    cout << "------------------" << endl;
    cout << endl;

    // Input Quantity
    cout << "Quantity of Books: ";
    cin >> quantity;
    cin.ignore(512,'\n');

    // Display Quantity
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << quantity << endl;
    cout << "------------------" << endl;
    cout << endl;

    // Input ISBN
    cout << "ISBN (including hyphens): ";
    cin.getline(ISBN,18);

    // Display ISBN
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << ISBN << endl;
    cout << "------------------" << endl;
    cout << endl;

    // Input Title
    cout << "Book Title: ";
    cin.getline(bookTitle,31);

    // Display Title
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << bookTitle << endl;
    cout << "------------------" << endl;
    cout << endl;

    // Input Price
    cout << "Unit Price: ";
    cin >> unitPrice;
    cin.ignore(512,'\n');

    // Display Price
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << unitPrice << endl;
    cout << "------------------" << endl;
    cout << endl;

    cout << endl;
    system("pause");
    return 0;
}

//END PROGRAM CODE

//BEGIN PROGRAM OUTPUT

/*
Please enter the following information.
Date (in MM/DD/YY format): 12/03/1970

------------------
*** 12/03/19
------------------

Quantity of Books:
------------------
*** 2000596547
------------------

ISBN (including hyphens):
------------------
***
------------------

Book Title:
------------------
***
------------------

Unit Price:
------------------
*** -1.#QNAN
------------------


Press any key to continue . . .
*/

ユーザー入力書籍情報 - 例 2 (正しく機能する)

/*
In this version, I use "cin >> setw(ARRAYSIZE) >> ARRAYNAME"
or "cin.get(ARRAYNAME, ARRAYSIZE)" and follow either instance
with a "cin.ignore(int,'\n')", then everything works perfectly.
*/

//BEGIN PROGRAM CODE

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    char date[9];
    char ISBN[18];
    char bookTitle[31];
    int quantity;
    double unitPrice;

    cout << "Please enter the following information.\n";

    // Input Date
    cout << "Date (in MM/DD/YY format): ";
    cin >> setw(9) >> date;
    cin.ignore(512,'\n');

    // Display Date
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << date << endl;
    cout << "------------------" << endl;
    cout << endl;

    // Input Quantity
    cout << "Quantity of Books: ";
    cin >> quantity;
    cin.ignore(512,'\n');

    // Display Quantity
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << quantity << endl;
    cout << "------------------" << endl;
    cout << endl;

    // Input ISBN
    cout << "ISBN (including hyphens): ";
    cin >> setw(18) >> ISBN;
    cin.ignore(512,'\n');

    // Display ISBN
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << ISBN << endl;
    cout << "------------------" << endl;
    cout << endl;

    // Input Title
    cout << "Book Title: ";
    cin.get(bookTitle,31);
    cin.ignore(512,'\n');

    // Display Title
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << bookTitle << endl;
    cout << "------------------" << endl;
    cout << endl;

    // Input Price
    cout << "Unit Price: ";
    cin >> unitPrice;
    cin.ignore(512,'\n');

    // Display Price
    cout << endl;
    cout << "------------------" << endl;
    cout << "*** " << unitPrice << endl;
    cout << "------------------" << endl;
    cout << endl;

    cout << endl;
    system("pause");
    return 0;
}

//END PROGRAM CODE

//BEGIN PROGRAM OUTPUT

/*
Please enter the following information.
Date (in MM/DD/YY format): 12/03/1970

------------------
*** 12/03/19
------------------

Quantity of Books: 200

------------------
*** 200
------------------

ISBN (including hyphens): 0-123-45678-90xxxxxx

------------------
*** 0-123-45678-90xxx
------------------

Book Title: Anthony Goes to Hollywood, Summer 2012 Edition

------------------
*** Anthony Goes to Hollywood, Sum
------------------

Unit Price: 12.00

------------------
*** 12
------------------


Press any key to continue . . .
*/
4

2 に答える 2

2

(n - 1) 文字が抽出されるか、区切り文字 (このパラメーターが指定されている場合は delim、指定されていない場合は '\n') が見つかるまで、文字が抽出されます。入力シーケンスでファイルの終わりに達した場合、または入力操作中にエラーが発生した場合にも、抽出は停止します。

区切り文字が見つかった場合、それは抽出されて破棄されます。つまり、格納されず、次の入力操作がその後に開始されます。この文字を抽出したくない場合は、代わりに member get を使用できます。

c-string の終わりを示す終了ヌル文字は、データが抽出された後に s に自動的に追加されます。

このサイズに達したために関数が読み取りを停止した場合、failbit 内部フラグが設定されます。

バッファサイズに達し、failbit フラグがセットされた場合、'\n' までの左の文字への処理は、コンパイラの実装に依存すると思います。コンパイラのフェイルビットが設定されている場合は、'\n' を無視するか、cin.clear() を使用するために、より多くのプロセスが必要になる可能性があります。

ただし、char 配列の代わりに string を使用することをお勧めします。

于 2012-06-03T09:26:42.197 に答える
0

より小さな文字列を書いてみましたか?または、cin.getline の文字数を増やすこともできます。

文字列の末尾にある "\n" が読み取れないと思います。一度書き込もうとすると、書き込みを終了するためのヌル ターミネータはありません。

フェcin.getline(date, 10)

于 2012-06-03T09:14:30.423 に答える