首页 > 解决方案 > 在 C 中解析主函数中的参数时出现意外结果

问题描述

我有非常简单的代码来理解 C 语言中 main 的命令行参数解析:

#include <stdio.h>

int main(int argc, char* argv[]){

for(int i=1; i < argc; i++)
printf("%d\n", argv[i]);

printf("Number of arguments: %d\n", argc);

}

在传递 3 个整数(例如 1、2、3)的终端中编译并执行后,我得到以下奇怪的结果:

1175842993
1175842995
1175842997
Number of arguments: 4

我知道解决方案正对着我的眼睛直截了当,但已经一个小时我无法真正弄清楚!有什么提示吗?谢谢!

标签: ccommand-linemain

解决方案


取消引用您的指针:

printf("%d\n", *argv[i]);

您可能还会有些惊讶,因为您会得到一个由打印的(第一个)字符表示的数值;例如1它是49

通常,您可以通过启用更多警告来告诉编译器告诉您更多信息。比如gcc -Wall会告诉你:

警告:格式 '%d' 需要类型为 'int' 的参数,但参数 2 的类型为 'char *' [-Wformat=] printf("%d\n", argv[i]);

这实际上是一个非常可靠的提示。

附带说明:如果你声明你的mainas int,你也应该返回一个。;)(但有关详细信息,请参阅 EDIT2)。


编辑:我想我应该在第二段中提到实际输出惊喜。

如果逐字转载论点是您真正想要的。正如Jonathan Leffler在评论中指出的那样,您将%s在格式化字符串中使用。在这种情况下,您希望传递的参数再次成为指向字符串的指针(即您不使用取消引用运算符)。*


EDIT2:正如Antti Haapala关于结束“旁注”所指出的那样。

使用 C99 或 C11 时,您不必为已声明为 return的main(我们正在谈论的)显式返回(一个值) 。在这种情况下,将假定为默认值。你真的只需要在遵守 C89 标准或其他功能时这样做。尽管为了简单起见和/或当不确定您的目标编译器配置是什么时,在声明的值类型和实际返回的值类型之间保持(类型)一致不会是错误的。然后再次。例如会让你知道这一点。mainint0gcc -Wall


推荐阅读