Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过main传入并设置全局int_C_Variables_Global_Main - Fatal编程技术网

C 通过main传入并设置全局int

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

我一直在尝试为我的堆栈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*/
}
我的全局变量是

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标准没有说明所使用的字符编码。