1

私はいくつかの変数を宣言します:

int area_code;
int telephone_number;

次のようなユーザーからの入力を取得したとき:

cout << "Enter the area code";
cin >> area_code;
cout << "Enter your local telephone number";
cin >> telephone_number;

今、私がそれらを表示したいとき、それらの電話番号が6152222222である場合、それは次のように表示されるべきです:

615-222-2222

最初の部分では、次のようにできます。

cout << area_code << "-";

しかし、その1つの変数のダッシュでそれらをどのように分離できるかわかりませんか?

4

5 に答える 5

4

数学を使用して、番号の市外局番と地域交換コードを計算できます。

  • 6152222222 / 10000最後の4桁を削除して、615222
  • さらに除算すると、次の1000ようになります615。除算の余りを取ると、が1000得られます222

int電話番号を表すためにを使用すると、などのよりエキゾチックな電話番号を保存する機能が制限されることに注意してください1-800-SOMETHING。追加の検証でカプセル化するクラスを使用するstringことは、より良い代替手段であることが証明される場合があります。

class phone_number {
string phone;
public:
    phone_number(const string& p) {
        // validate p...
        if (p.size() != 10) {
            // Do something violent here...
            cerr << "The phone number is incorrect." << endl;
        }
        // Validate more things about the number before the assignment...
        phone = p;
    }
    friend ostream& operator<<(ostream &os, const phone_number& p);
};

ostream& operator<<(ostream &os, const phone_number& pn) {
    const string &p(pn.phone);
    os << "(" << p.substr(0, 3) << ")" << p.substr(3, 3) << "-" << p.substr(6);
    return os;
}

int main() {
    phone_number p = phone_number("6152784567");
    cout << p << endl;
    return 0;
}

これにより、ideoneで期待される出力が生成されます

于 2012-08-06T15:52:36.087 に答える
4

電話番号は整数変数に格納しないでください。電話番号の長さ、必要な特殊文字、アルファベット文字が必要かどうか、先行ゼロなどはわかりません。

本当の解決策は、少なくともを使用することstd::stringです。

于 2012-08-06T15:55:29.757 に答える
2

あなたはこれを使用して行うことができますstd::numpunct

#include <iostream>
#include <locale>

struct telephone: std::numpunct<char> {
    char do_thousands_sep() const { return '-'; }
    std::string do_grouping() const { return "\04\03"; }
};

int main() {
    std::cout.imbue(std::locale(std::cout.getloc(), new telephone));
    std::cout << 6152222222ll;
}

出力:

615-222-2222

従来の理由で整数として保存された電話番号を処理する必要がない限り、この方法はまだお勧めしません。文字列の使用はより柔軟です。

于 2012-08-06T16:15:50.677 に答える
0

これらをstd::stringタイプに変更します。次に、substr操作を使用して、最初の3桁などを取得します。stringstreamを使用して、intとstringの間を移動します。

そして、正直なところ、これらの変数をintで保持することを主張する場合は、一時的に文字列に変換し、文字列操作を使用して値を計算することをお勧めします。とを使用しxxx-xxxxて独自のコードを作成する/%、基本的に作業が複製されるためです。それは<<、操作であなたに行われました>>

また、bee-tee-dubsは、その数値が32ビットのsignedまたはunsigned intに実際には収まらないため、間違ったデータ型を使用した場合の別の症状と考えられます。

なんらかの理由でCで考えていたので、CではなくC++で文字列と文字列opsをフレーバーするように編集しました。

于 2012-08-06T15:52:17.097 に答える
-1

入力を3つの異なる数値に分割するだけです。

end = 6152222222 % 10000
middle = 6152222222 / 10000
areaCode = middle / 1000
middle = middle % 10000
于 2012-08-06T15:56:11.023 に答える