2

この疑似コードを達成しようとするプログラムを C++ で作成しようとしています。

get argv[1] into int

get int’s digits into array[int length]

for int i = array length; i >= 0;

gen random number into check

if check == array[i]
    i
    say Number i was check
end if

そして、私が本当に苦労している部分は、

get argv[1] into int

get int’s digits into array[int length]

部。私の完全なコードでは、私が試したことがないため、試みさえありません。私が最もよく得るエラーは、コードがコンパイルされることですが、入力しようとするたびにcout << "Number 1:" << numberNumber 1: 0実際に入力した数値に関係なく発生します。そして0 == 0、コードが気付かないとき。

私の壊れたおそらく規約違反のコードは次のとおりです。

#include <iostream>
#include <string>

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

    if (argc == 1 || argc == 3) {
        std::cout << "Argument count does not match (one argument expected)\n";
        return(-1);
    }

    std::cout << "Input: " << argv[1] << "\n";

    const char* text = argv[1];
    int number = atoi(text);

        int check = rand() % 10;

        std::cout << "Check 1: " << check << "\nNumber 1: " <<  number << "\n";

        if (check == array[i]) {
            i++;
            std::cout << "Success! Number " << i << " was " << check << ".\n";
        }
    }
}

TL;DR: 私の「一種の」数値クラッカーは、argv 1を int に入れ、後で int の数字を配列に入れることを望んでいません。

私をばかに感じさせてください。質問が具体的すぎないことを願っています。ご要望に応じて詳細をご説明します。

編集:これは以前の変換の試みです:

    int array[];
    for (int i = strlen(text); i >= 0; i--) {
        array[i] = number % 10;
        number /= 10;
    }

EDIT2: 非常に多くの応答があり、解決策はありません。この初心者に一度に多くのことを説明していただきありがとうございます。ところで:Git

4

3 に答える 3

2

以前の試みはほとんどうまくいっています: 次のように、実際に配列にスペースを割り当てなければならないだけです:

int array[strlen(text)];

コンパイラが拡張機能として可変長配列をサポートしている場合、および

std::vector<int> array;
array.resize(strlen(text));

標準の C++ に固執し、いくつかの優れたプラクティスに従いたい場合。

ただし、トリッキーにしたい場合は、引数を数値に変換する必要さえありません。

if (argv[1][i] == check % 10 + '0')

トリックも行います。全体として、完全なプログラムは次のようになります。

#include <iostream>
#include <cstdlib>


int main(int argc, char *argv[])
{
    int check = std::rand();
    std::cout << check << std::endl;

    char *p = argv[1] + strlen(argv[1]);
    while (p - argv[1] >= 0) {
        if (*--p == '0' + check % 10)
            std::cout << "guessed " << p - argv[1] << "th digit" << std::endl;

        check /= 10;
    }

    return 0;
}
于 2013-07-16T13:35:02.297 に答える
1

あなたのコードは比較的正しいです。配列の宣言に苦労しています (配列のサイズを指定する必要があります)。32 ビットintでは 10 桁を超えることはできないため、

int array[10];

十分なはずです。

数値を数字の配列に変換する前に、負かどうかを確認し、負の場合は符号を反転します。

if (number < 0) {
    number = -number;
}

そうでなければ、あなたのnumber%10トリックはうまくいきません。

変換を行うときは、何桁あるかを数えます。結果をactualCount変数に入れます。配列内のすべての桁を使い切ることはない可能性があります。

int check = rand() % 10; // 10 is the max, not the actual digit count

する必要があります

int check = rand() % actualCount;

引数のチェックも改善する必要があります。ユーザーが 5 つのパラメーターを渡すとどうなるか考えてみてください。引数が 1 つだけ必要な場合は、次のように記述します。

if (argc != 2) {
    std::cout << "Argument count does not match (one argument expected)\n";
    return(-1);
}
于 2013-07-16T13:36:39.950 に答える
0

数値から一度に 1 桁だけを抽出するには、いくつかの選択肢があります。

便宜上、 を使用してstd::string、元の文字列 ( ) を挿入し、一度にargv[1]1 つずつ抽出できますchar

#include <string>

...    

// put the input in a string
std::string text = argv[1];

for (unsigned i = 0; i < text.size(); i++)
{
   // extract only one char, a digit
   char ch = text.at(i);
   // convert that char in a number
   int n = ::atoi(& ch);

   // use n
   ...
}

を使用したくない場合はstd::string、いつでも c ライクな配列 (argv[1]それ自体)を使用できます。

#include <cstring>

...    

for (unsigned i = 0; i < strlen(argv[1]); i++)
{
   // extract only one char, a digit
   char digit = argv[1][i];
   // convert that char in a number
   int num = ::atoi(& digit);

   // use n
   ...
}
于 2013-07-16T13:37:50.890 に答える