通过main传入并设置全局int

时间:2013-02-01 17:59:10

标签: c variables global main

我一直在尝试为Stack ADT创建一个测试程序,方法是动态传入要添加到堆栈中的项目数量。但是,当我尝试传入一个整数时,例如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 个答案:

答案 0 :(得分:3)

你的问题在这里:

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

这会读取您传入的第一个int的{​​{1}}值...因为您传入char,它将获得22的ASCII值在 12月50日下的Refer to this chart(感谢asciitable.com):

ASCII table

您想要做的是使用2将整个cstring解释为整数:

atoi

int items = atoi(numItems[1]);

strtol

答案 1 :(得分:0)

您需要做的是numItems = atoi(argv[1]),而不是将所述参数的第一个字符转换为int。请阅读atoi(3)上的手册页。做一个忙,请阅读Steve Summit的C tutorial(是的,它已过时,但仍然非常相关)。另请阅读Rob Pike在C style上发布的一些文章。

答案 2 :(得分:0)

C程序命令行参数中,即使传递整数或浮点数,也会以字符串形式接收参数。

如果你传递10,那么argv[1]将具有两个字节的字符串的地址,其ASCII值为1(49)和0(48)。因此*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 整数。

{{1}}

答案 3 :(得分:0)

所以其他人基本上明白了这一点:你获得的价值不是22,而是"22"的第一个字符的字符代码,它是2的字符代码(如果您的系统使用ASCII或Unicode,则可能为50。)

但是对于上帝的爱,不要使用atoi()!它已被弃用,丑陋,不安全且不完整。您应该使用strtol()strtoll()代替:

int theNum = strtol(argv[1], NULL, 10);