0

我一直在尝试通过动态传递要添加到堆栈的项目数量来为我的堆栈 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

4 回答 4

3

Your problem is here:

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

This will read the int value of the first char that you pass in... Since you pass in 22, it will get the ASCII Valule of 2 which is 50. Refer to this chart (thanks asciitable.com) under Dec 50:

ASCII table

What you want to do instead is interpret the whole cstring as an integer, using atoi:

int items = atoi(numItems[1]);

or strtol:

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

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

但是看在上帝的份上,不要使用atoi()! 它已被弃用、丑陋、不安全且不完整。您应该使用strtol()orstrtoll()代替:

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

您需要做的是numItems = atoi(argv[1])将所述参数的第一个字符转换为int. 阅读手册页atoi(3)。帮自己一个忙,去阅读 Steve Summit 的C 教程(是的,它已经过时了,但仍然非常相关)。另请阅读 Rob Pike 关于C 风格的漫谈。

于 2013-02-01T18:07:12.220 回答
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
于 2013-02-01T18:07:35.537 回答