在C语言中,"argv['A']"的含义是什么?

3
我找到了下面的代码,但我不理解它是什么或者如何工作。在 C 语言中,我只见过使用整数索引的 argv[n],而从未见过像 argv['A'] 这样使用字符字面量的形式。
if(argc != 100) return 0;
if(strcmp(argv['A'],"\x00")) return 0;
if(strcmp(argv['B'],"\x20\x0a\x0d")) return 0;
printf("Stage 1 clear!\n");

这是做什么的?你可以解释一下为什么它会起作用吗?


5
"A" 是一个数字,请尝试使用 printf("%d\n", 'A'); 进行输出。 - mch
3
假设使用ASCII编码'A' 等于整数值 65 - Some programmer dude
4
你在哪里看到这段糟糕的代码的? - Jabberwocky
变量看起来像是主函数的参数。这个代码示例真的来自主函数吗? - SKi
对于未来看到这条信息的人。这是来自pwnable.kr的一个名为“input”的挑战。 - Anas Tawtaw
显示剩余2条评论
2个回答

5

从技术上讲,这在C语言中是合法的,可以用来访问argv数组的一个元素(argv[65])。

编辑: 如John Ballinger在评论中所指出的,只有当您的C实现将字符文字映射到它们的ASCII值时,这才是有效的,这并不是标准所要求的。然而,大多数C实现都会这样做,因此我会认为代码的作者使用了这个假设。

这是因为在C语言中,所有的字符文字都可以作为数字文字使用。

当然,如果您希望argv数组中有65个及以上的元素,那么可能有些问题。即使是这种情况,除非您将argv数组与字母有某种具体关联,否则使用索引65和66的'A''B'也没有意义。

简而言之,这是一个索引,但这段代码异常复杂,可能有意进行了混淆。


2
从技术上讲,访问哪个argv元素取决于实现。实现不需要使用ASCII将字符映射到整数,有些实现不会这样做。 - John Bollinger
所有字符字面量都可以作为数字字面量。字符字面量无论如何都具有int类型。 - Gerhardh
@Gerhardh. 是的,但很多人忘记了char是一个整型数字类型。所以我只是在这方面进行明确。 - Edward Minnix

2
"'A'只是一种用int类型指定值的方式(考虑到你传递了一个字母数字字符,它必须能够适合于char类型)。值是实现定义的,尽管在ASCII中,它的值为65。

所以argv['A']有点像int n = 'A'; argv[n];

程序是否配备了足够多的命令行参数(argc会告诉你,而if(argc!= 100)是不充分的检查)另当别论。总之,在C中可以从main函数内部调用自己;也许命令行参数是作为混淆练习引入的。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接