0

私は C++ の初心者です。

(コマンド ラインで) A/B の形式で入力された分数から分子と分母を取得したい。A と B をそれぞれの変数に入れる最も簡単な方法は何ですか?

4

4 に答える 4

7

C++ を使用する最も簡単な方法は次のとおりです。

double numerator, denominator;
char   dummy;
if (in >> numerator >> dummy >> denominator) {
    // ...
}

上記は、ストリームから有理値を読み取ります。コマンドラインで引数からストリームを取得するには、次を使用しますstd::istringstream

int main(int ac, char* av[]) {
    for (int i(1); i != ac; ++i) {
        std::istringstream in(av[i]);
        // ...
    }
}

主な欠点は、分離文字が上記の抽出コードで何でもかまいません。これを修正するには、slashマニピュレータを使用します。

std::istream& slash(std::istream& in) {
    if (in.get() != '/') {
        in.setstate(std::ios_base::failbit);
    }
    return in;
}
// ...
if (in >> numerator >> slash >> denominator) {
    // ...
}

このソリューションは高く評価されているように見えるので、必要に応じて の実装を少し調整したい場合があることを指摘しておきますslash()。投稿されたバージョンでは、分子の直後にスラッシュが必要です。先頭の空白をスキップするのが合理的かもしれません:

if ((in >> std::ws).get() != '/') {
    ...
}

また、これは 1 つのキャラクタだけに対する特別な実装であり、他のキャラクタにも同様のマニピュレータが必要になる場合があります。コードの複製を避けるために、マニピュレーターをテンプレートにすることができます。

template <char Separator>
std::istream& separator(std::istream& in) {
    if ((in >> std::ws).get() != std::char_traits<char>::to_int_type(Separator) {
        // ...
}
typedef std::istream& (*separator_manipulator)(std::istream&);
separator_manipulator const slash = &separator<'/'>;
separator_manipulator const comma = &separator<','>;
// ...

使用する必要があるのは、負の値で s をstd::char_traits<char>::to_int_type()使用する場合の問題を回避するためです。char

于 2012-10-18T18:33:03.350 に答える
2

scanf. C++ でも動作します。変数名は小文字で始める必要があることに注意してください。

int a, b;
scanf("%d/%d", &a, &b);
于 2012-10-18T18:29:15.063 に答える
0

コマンド ライン引数は、C 文字列 (つまり、文字ポインタ) として渡されます。プログラムの基本的なフレームワークがあれば、すでに...

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

...またはそのようなもの。argv 配列の最初のメンバー (つまり、argv[0]) は、実行中のプログラムの名前への文字ポインターです。残りの引数 (argv[1] から argv[argc-1]) は、コマンド ライン引数です。

c/c++ を学んでいるだけなら、デバッガーの下で基本的な単純なプログラムを実行して、さまざまな引数を渡し、引数をスペースで囲み、環境変数を引数として使用し、実際に何が渡されるかを実験して確認する必要があります。

これを理解したら、A/B を引数として使用します。数値ではなく文字列になるので、「/」で区切る必要があります。

int a, b;
scanf("%d/%d", &a, &b);

数字とスラッシュをすべて一緒に実行して 1 つの引数を作成する限り、機能します。シェルは通常、さまざまな引数を区切るためにスペースを使用します。

他の方法を使用して、スラッシュと値を見つけることができます。あなたの質問に対する答えは、c++ に固有のものである必要はありません。Scanf は c/c++ の両方で機能します。もう1つの簡単な方法は...

char *copyOfString = strdup(argv[1]);
char *B = strchar(copyOfString, '/');
*B = NULL;
B++;
char *A = copyOfString;

これで、整数 (要件によっては float または double) に変換する必要がある値の文字列形式が得られました。もちろん、エラー チェックは行われないため、プログラムを正確に呼び出さないと、プログラムの混乱が生じます。

他の方法で他の回答を投稿した人もいますが、これが役に立ち、c/c++ プログラミングへようこそ。そして、良い本を手に入れてください。試行錯誤はこれまでのところしかなく、C/C++ は非常に容赦がありません。

于 2012-10-18T18:44:42.163 に答える
-1

-Removed-コマンド ラインで回答を完了しなかったための投稿者。

他の人が示したように、std から読み込んだら、文字列ルックアップ strtok を分割します。

于 2012-10-18T18:33:01.193 に答える