1

コマンド ラインで 2 つの ASCII 文字を入力として受け取る C++ プログラムを作成しています。次に、これらの文字間の範囲と、その文字に対応する 10 進数、8 進数、および 16 進数のコードを表示します。

私が抱えている問題は、コマンド ライン パラメーターを型キャストすることです。

コマンドライン文字は char* argv[] に保存され、それらを int に直接キャストすると (10 進数、8 進数、16 進数)、風変わりな出力が得られます。

それらをchar変数に保存してから、その別の変数をintに型キャストしようとすると、argv [1]をcharに保存できません。次のエラーが表示されます。

エラー: タイプ "char *" の値を使用して、タイプ "char" のエンティティを初期化することはできません

注: 表示するロジックは完全ではありません。コマンドラインに問題があり、最初にそれに取り組みたかったので

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

int main(int argc, char *argv[])
{
    //If there are no command line parameters, display this info
    if (argc == 1)
    {
        cout << 

        "This program takes two printable ASCII characters as input, with t"
        "he first\ncharacter preceding the second in the ASCII character se"
        "quence. The program\nthen displays all characters in the range det"
        "ermined by those two characters,\nalong with their corresponding d"
        "ecimal, octal and hexadecimal codes, four per\nline, with a suitab"
        "le header and a pause if the display consumes more than a\nsingle "
        "screen of output. The two input character values must be entered a"
        "s\ntwo separate command-line parameters, and there is no error che"
        "cking.\n\n"

        "The printable ASCII characters extend from the blank space charact"
        "er (' ',\nwith code 32 decimal) to the tilde character ('~', with "
        "code 126 decimal).\nThe characters with codes in the range 0 to 31"
        " and also code 127 are non-\nprintable \"control characters\".\n\n"

        "When entering characters at the command line to determine the char"
        "acter range\nwe want in the output, we need to be very careful how"
        " we enter some characters.\nThese include the the blank space char"
        "acter and some others that are treated\nas \"meta characters\" by "
        "the operating system, and are thus not passed to the\nprogram for "
        "processing.\n\n";

        cout << setw(75) << "Screen 1 of 2" << endl;
        cout << "Press Enter to continue ... ";
        cin.ignore (80, '\n');

        cout << endl;
        cout << "Such characters need to be enclosed in double quotes, except ("
        "of course) for\nthe double-quote character itself (\"), which can be "
        "\"escaped\" by placing a\nbackslash character (\\) in front of it. Her"
        "e is a list of such characters,\nand how they should be entered on the"
        " command line:\n\n"

        "\" \" the blank space\n"
        "\"&\" the ampersand\n"
        "\"<\" the less-than operator, which redirects input\n"
        "\">\" the greater-than operator, which redirects output\n"
        "\"^\" the hat symbol\n"
        "\"|\" the vertical bar, or pipe symbol\n"
        "\\\"  the double-quote symbol\n\n"

        "All other characters can be entered as themselves.\n\n\n\n\n\n\n\n\n";

        cout << setw(75) << "Screen 2 of 2" << endl;
        cout << "Press Enter to continue ... ";
        cin.ignore (80, '\n');
    }
    //Else if there are command line parameters, display decimal, octal and
    //hexadecimal
    else
    {
        char cFirst = argv[1];

        int first = (int)argv[1];
        int last = (int)argv[2];

        int range = last - first;

        if (range == 0)
        {
            cout << "     Dec Oct Hex" << endl;
            cout << setw(4) << argv[1] << setw(4) << dec << first 
                 << setw(4) << oct << first << setw(4) << hex << first << endl;
            cout << "Press Enter to continue ... ";
            cin.ignore (80, '\n');   
        }

        else if (range == 1)
        {
            cout << "     Dec Oct Hex     Dec Oct Hex" << endl;
            cout << setw(4) << argv[1] << setw(4) << dec << first 
                 << setw(4) << oct << first << setw(4) << hex << first;
            cout << setw(4) << argv[2] << setw(4) << dec << last
                 << setw(4) << oct << last << setw(4) << hex << last << endl;
            cout << "Press Enter to continue ... ";
            cin.ignore (80, '\n'); 
        }

        else if (range == 2)
        {
            int middle = first + 1;
            cout << "     Dec Oct Hex     Dec Oct Hex     Dec Oct Hex" << endl;
            cout << setw(4) << argv[1] << setw(4) << dec << first 
                 << setw(4) << oct << first << setw(4) << hex << first;
            cout << setw(4) << (char)middle << setw(4) << dec << middle 
                 << setw(4) << oct << middle << setw(4) << hex << middle;    
            cout << setw(4) << argv[2] << setw(4) << dec << last
                 << setw(4) << oct << last << setw(4) << hex << last << endl;
            cout << "Press Enter to continue ... ";
            cin.ignore (80, '\n'); 

        }

        else if (range >= 3 && range <= 87)
        {
            cout << "     Dec Oct Hex     Dec Oct Hex     Dec Oct Hex     Dec O"
                    "ct Hex" << endl;

            int count = 0;
            for (int i = first; i <= last; i++)
            {
                if (count < 4)
                {
                    cout << setw(4) << (char)i << setw(4) << dec << i << setw(4)
                         << oct << i << setw(4) << hex << i;
                    count++;
                }
                else 
                {
                    cout << endl;
                    count = 0;
                }
            }
        }

        else if (range >= 88)
        {
            cout << "     Dec Oct Hex     Dec Oct Hex     Dec Oct Hex     Dec O"
                    "ct Hex" << endl;
        }


        for (int i=first; i<=last; i++)
        {

            char working = (char)i;
            cout << (char)i << "  " << dec << i << oct << i << hex << i;
        }
        cin.ignore (80, '\n');

    }
}
4

1 に答える 1

3

argv文字列(文字ではない)の配列を指します。引数の最初の文字にアクセスするには、次のようにする必要があります。

int first = (int)argv[1][0];
int last = (int)argv[2][0];

また、代わりに

cin.ignore (80, '\n');   

使ってください

cin.ignore(numeric_limits<streamsize>::max(), '\n');

抽出 (および無視) する最大文字数。これが正確numeric_limits<streamsize>::max()に である場合、制限はありません。 delim (またはファイルの終わり) が見つかるまで、必要な数の文字が抽出されます。

于 2013-09-15T16:38:20.460 に答える