6

4桁しかない口座番号の入力を求める問題をやっています。これは、基本的な初心者 C++ で行う必要があります。

整数の入力を 4 桁に制限する方法を見つける必要があります。ユーザーは 0043 または 9023 または 0001 を入力できる必要があり、許容値である必要があります....

文字列でそれを達成する方法を知っていると思います.... getline(cin,input) そして、input.length()==4 かどうかを確認しますか?

しかし、整数入力でこれを行う方法さえわかりません。

4

6 に答える 6

2

0043と区別することを目的としている場合43、入力は実際には数字ではなく、電話の「番号」のように数字列であることに注意してください。

行を文字列として読み取りますinput

の長さinputが。であることを確認してください4

文字列の各文字が<= '9'とであることを確認し>= '0'ます。

何かのようなもの:

std::string read4DigitStringFromConsole()
{
    bool ok = false;
    std::string result;
    while (!ok)
    {
        std::cin >> result;
        if (result.length() == 4)
        {
            bool allDigits = true;
            for(unsigned index = 0; index < 4; ++index)
            {
                allDigits = allDigits && ( 
                    (result[index] >= '0') && 
                    (result[index] <='9') 
                    );
            }
            ok = allDigits;
        }
    }
    return result;
}
于 2013-01-25T02:35:10.613 に答える
1

string入力としてaを使用するというあなたのアイデアが好きです。アカウントの「番号」は単なる識別子であるため、これは理にかなっています。計算には使用しません。であなたはの長さをif (sizeof(input)==4)チェックしようとしていると思いますstring。これを行う正しい方法はですif (input.length() == 4)これにより、ユーザーが4文字を入力したことが確認されます。次に、各文字も数字であることを確認する必要があります。数字のASCIIコードが期待どおりに順序付けられているという事実を利用することで、これを簡単に行うことができます。したがってif (input[i] >= '0' && input[i] <= '9')、インデックスの適切なforループを使用してトリックを実行しますi。また、ユーザーが正しいと思われるものを入力するまで入力を要求し続ける、ある種のループがおそらく必要です。

編集:

int各文字が数字であることを確認する代わりに、文字列をwithに変換することもできますint value = atoi(input.c_str());intそうすれば、が4桁以下の数字かどうかを簡単に確認できます。

于 2013-01-25T02:36:46.680 に答える
1

このようなものが機能するはずです。ユーザーが正確に4文字で何かを入力したら、それを検証できます。残りのロジックはあなた次第です。

#include <iostream>
#include <string>

int main() {
    std::cout << "Enter a PIN Number: ";
    std::string pinStr;
    while(std::getline(std::cin,pinStr) && pinStr.size() != 4) {
        std::cout << "Please enter a valid value\n";
    }
}

整数形式で格納する場合は、整数をに保持すると便利な場合がstd::vectorあります。これは簡単に実行できます(ループの展開はわかりやすくするためです)。

#include <iostream>
#include <string>
#include <vector>

int main() {
    std::cout << "Enter a PIN Number: ";
    std::string pinStr;
    while(std::getline(std::cin,pinStr) && pinStr.size() != 4 ) {
        std::cout << "Please enter a valid value\n";
    }
    std::vector<int> pin;
    pin[0] = pinStr[0] - '0';
    pin[1] = pinStr[1] - '0';
    pin[2] = pinStr[2] - '0';
    pin[3] = pinStr[3] - '0';

    //pin now holds the integer value.
    for(auto& i : pin)
        std::cout << i << ' ';
}

ここで実行されているのを見ることができます

于 2013-01-25T02:36:53.567 に答える
0

コードがユーザー入力に応答するようにしたい場合は、文字列を読み取るのではなく、一度に各文字を取得することをお勧めします。

std::string fourDigits;
char currentDigit;

std::cout << "Enter 4 digits\n";
for(int i = 0; i < 4; ++i)
{
    currentDigit = getch();
    if(isdigit(currentDigit))
    {
        fourDigits += currentDigit;
        std::cout << currentDigit; // getch won't display the input, if it was a PIN you could simply std::cout << "*";
    }
    else
    {
            // Here we reset the whole thing and let the user know he entered an invalid value
        i = 0;
        fourDigits = "";
        std::cout << "Please enter only numeric values, enter 4 digits\n";
    }
}

std::cout << "\nThe four digits: " << fourDigits.c_str();

このようにして、正常に無効な文字を即座に処理できます。文字列を使用する場合、入力はユーザーがを押したときにのみ検証されますEnter

于 2013-01-25T02:43:17.973 に答える
0
// generic solution
int numDigits(int number)
{
    int digits = 0;
    if (number < 0) digits = 1; // remove this line if '-' counts as a digit
    while (number) {
        number /= 10;
        digits++;
    }
    return digits;
}

この投稿に似ています。次に、この関数を呼び出して、入力が 4 桁かどうかを確認できます。

于 2013-01-25T02:40:03.710 に答える
0

そこで、整数型を使用して入力を取得する方法を調べていて、char を調べました...技術的には最小の整数型であるため、コードを取得するために使用できます...思いつくことができましたこれですが、まだ洗練されていないことは間違いありません(それが可能かどうかはわかりません):

int main() {
    int count=0;

    while(!(count==4)){
        char digit;
        cin.get(digit);
        count++;
    }

    return 0;
}

ということで、4キャラ揃うまでループが続きます。まあ、理論的にはそうすべきです。しかし、うまくいきません。2桁、5桁などで止まります....空白をつかむcin.get()の性質である可能性があると思いますが、わかりません。

于 2013-01-25T06:12:50.763 に答える