0

スタックに追加するアイテムの量を動的に渡すことにより、StackADTのテスターを作成しようとしています。ただし、たとえば22の整数を渡そうとすると、グローバル変数(ITEMS)が50として割り当てられます。他の何かを試してみると、範囲は45〜55です。

私の主な機能はこれです:

int main(int numArgs, char* numItems[]) {
    Stack stack;

    if (numArgs == 0) {
        printf("Good job, you broke C.\n");
    } else if (numArgs == 2) {
        int items = (int)*numItems[1];
        if(*numItems[1] != ITEMS) {
            setItems(items);
        } 
    } else if (numArgs>=3) {
        printf("Usage: TestStack <numItems> <-help>\n");
        exit(1);
    } else if(numItems[1] == "-h" || numItems[2] == "-help") {
        printf("numItems   - Number of items to add to the stack.\n            -h     (-help) -  Shows this help output.\n");
        exit(1);
    }
    /* test code here*/
}

割り当て機能は次のとおりです。

static void setItems(int numItems) {
    ITEMS = numItems;
    printf("ITEMS IS %d\n",ITEMS);
}

そして私のグローバル変数は

int ITEMS = 11; //Default value.

渡そうとしている本当の価値を実際に得ることができない理由は何ですか?

4

4 に答える 4

3

あなたの問題はここにあります:

int items = (int)*numItems[1];

intこれにより、最初に渡した値が読み取らcharれます...渡した22ため、ASCII値が50になり2ます。 12月50日の下にあるこのチャート(thanks asciitable.com)を参照してください。

ASCIIテーブル

代わりに、次を使用してcstring全体を整数として解釈しますatoi

int items = atoi(numItems[1]);

またはstrtol

int items = strtol(numItems[1], NULL, 10);
于 2013-02-01T18:03:06.853 に答える
0

あなたがする必要があるnumItems = atoi(argv[1])のは、上記の引数の最初の文字をにキャストする代わりのようなものintです。のマニュアルページを読んでくださいatoi(3)。そして、あなた自身に賛成してください、スティーブサミットのCチュートリアルを読んでください(はい、それは日付が付けられていますが、それでも非常に関連性があります)。Cスタイルに関するRobPikeのとりとめのない話も読んでください。

于 2013-02-01T18:07:12.220 に答える
0

プログラムのコマンドラインではC、整数または浮動小数点数を渡しても、引数は文字列として受け取られます。

10を渡すargv[1]と、ASCII値が1(49)と0(48)の2バイトの文字列のアドレスになります。したがって*argv[1]、最初のバイトの値である49を指定します。これを文字として印刷しようとする1と取得48するか、整数として印刷しようとすると取得します。

printf("%s", argv[1]) //will print 10
printf("%u", argv[1]) //will print address of the string "10"
printf("%c", *argv[1]) //will print 1
printf("%d", *argv[1]) //will print 49
于 2013-02-01T18:07:35.537 に答える
0

22したがって、他の人は基本的に要点を述べました。取得する値は、の文字​​コードであるの最初の文字の文字コードではありません(システムがASCIIまたはUnicodeを使用している場合はおそらく50)"22"2

しかし、神の愛のために、使用しないでくださいatoi()!非推奨で、醜く、安全ではなく、不完全です。strtol()またはstrtoll()代わりに使用する必要があります:

int theNum = strtol(argv[1], NULL, 10);
于 2013-02-01T18:10:09.687 に答える