我一直在尝试为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.
任何我无法真正获得真正价值的理由?
答案 0 :(得分:3)
你的问题在这里:
int items = (int)*numItems[1];
这会读取您传入的第一个int
的{{1}}值...因为您传入char
,它将获得22
的ASCII值在 12月50日下的Refer to this chart(感谢asciitable.com):
您想要做的是使用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);