C 通过main传入并设置全局int
我一直在尝试为我的堆栈ADT创建一个测试仪,方法是动态传递要添加到堆栈中的项目数量。但是,当我尝试传入一个整数时,例如22,它将全局变量(ITEMS)赋值为50。如果我尝试其他方法,范围在45到55之间 我的主要职能是:C 通过main传入并设置全局int,c,variables,global,main,C,Variables,Global,Main,我一直在尝试为我的堆栈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
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*/
}
我的全局变量是
int ITEMS = 11; //Default value.
是否有任何原因导致我无法获得我试图传递的实际值?您的问题在于:
int items = (int)*numItems[1];
这将读取传入的第一个字符的int
值。。。由于您传入22
,它将得到2
的ASCII值,即50。(感谢asciitable.com)在12月50日的下:
您要做的是使用atoi
,将整个cstring解释为一个整数:
int items = atoi(numItems[1]);
或strtol
:
int items = strtol(numItems[1], NULL, 10);
你的问题是:
int items = (int)*numItems[1];
这将读取传入的第一个字符的int
值。。。由于您传入22
,它将得到2
的ASCII值,即50。(感谢asciitable.com)在12月50日的下:
您要做的是使用atoi
,将整个cstring解释为一个整数:
int items = atoi(numItems[1]);
或strtol
:
int items = strtol(numItems[1], NULL, 10);
您需要做的是类似于
numItems=atoi(argv[1])
的操作,而不是将所述参数的第一个字符强制转换为int
。请阅读atoi(3)上的手册页。帮你自己一个忙,去读史蒂夫·萨米特的(是的,它已经过时了,但仍然非常相关)。也请阅读Rob Pike的漫谈。您需要做的是类似于numItems=atoi(argv[1])
的操作,而不是将所述参数的第一个字符强制转换为int
。请阅读atoi(3)上的手册页。帮你自己一个忙,去读史蒂夫·萨米特的(是的,它已经过时了,但仍然非常相关)。另外,请阅读Rob Pike的漫谈。在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
在
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
因此,其他人基本上指出了这一点:您获得的值不是
22
,而是“22”
的第一个字符的字符代码,这是2
的字符代码(如果您的系统使用ASCII或Unicode,可能是50)
但是看在上帝的份上,不要使用atoi()!这是不推荐的,丑陋的,不安全的和不完整的。您应该使用strtol()
或strtoll()
:
int theNum = strtol(argv[1], NULL, 10);
因此,其他人基本上指出了这一点:您获得的值不是
22
,而是“22”
的第一个字符的字符代码,这是2
的字符代码(如果您的系统使用ASCII或Unicode,可能是50)
但是看在上帝的份上,不要使用atoi()!这是不推荐的,丑陋的,不安全的和不完整的。您应该使用strtol()
或strtoll()
:
int theNum = strtol(argv[1], NULL, 10);
参数以字符串形式出现,因此您将获得字符串中第一个字符的值。正如Chris在下面指出的,您需要将字符串转换为整数。
printf(“干得好,您弄坏了C.\n”)代码>-现在这很搞笑。参数以字符串形式出现,因此您将获得字符串中第一个字符的值。正如Chris在下面指出的,您需要将字符串转换为整数。printf(“干得好,您弄坏了C.\n”)代码>-现在这太搞笑了。谢谢!我对C很陌生,所以atoi对我来说是全新的。不过谢谢,它成功了!“它将获得ASCII值2”-即使您的系统不是ASCII?不要误导初学者。C标准没有提到使用的字符编码。谢谢!我对C很陌生,所以atoi对我来说是全新的。不过谢谢,它成功了!“它将获得ASCII值2”-即使您的系统不是ASCII?不要误导初学者。C标准没有说明所使用的字符编码。