在 C 中解析主函数中的参数时出现意外结果
Unexpected result when parsing argument in main function in 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
我知道解决方案就在眼前,但我已经一个小时了,无法真正弄明白!有什么提示吗?谢谢!
取消引用您的指针:
printf("%d\n", *argv[i]);
您可能还会有点惊讶,因为您将得到一个由打印的(第一个)字符表示的数值;例如 1
是 49
.
一般来说,您可以通过启用更多警告告诉您的编译器告诉您更多信息。例如 gcc -Wall
会告诉你:
warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
printf("%d\n", argv[i]);
这实际上是一个非常可靠的提示。
附带说明:如果您将 main
声明为 int
,您也应该 return。 ;)(但有关详细信息,请参阅 EDIT2)。
编辑:我想我应该在第二段中提到实际输出惊喜。
如果逐字重印论点是您真正想要的。正如 Jonathan Leffler 在评论中指出的那样,您将在格式字符串中使用 %s
。在这种情况下,您希望传递的参数再次成为指向字符串的指针(即您不使用 *
解引用运算符)。
EDIT2:正如 Antti Haapala 关于关闭 "Side note" 所指出的那样。
使用 C99 或 C11 时,您不必为已声明为returnint
。在这种情况下,默认值为 0
。你真的只需要在遵守 C89 标准或其他功能时这样做。为了简单起见,虽然 and/or 当不确定您的目标编译器配置是什么时,您在声明的值类型和实际 returned 值类型之间保持(类型)一致是不会错的。然后再次。 gcc -Wall
例如会让您知道。
我有非常简单的代码来理解 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
我知道解决方案就在眼前,但我已经一个小时了,无法真正弄明白!有什么提示吗?谢谢!
取消引用您的指针:
printf("%d\n", *argv[i]);
您可能还会有点惊讶,因为您将得到一个由打印的(第一个)字符表示的数值;例如 1
是 49
.
一般来说,您可以通过启用更多警告告诉您的编译器告诉您更多信息。例如 gcc -Wall
会告诉你:
warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=] printf("%d\n", argv[i]);
这实际上是一个非常可靠的提示。
附带说明:如果您将 main
声明为 int
,您也应该 return。 ;)(但有关详细信息,请参阅 EDIT2)。
编辑:我想我应该在第二段中提到实际输出惊喜。
如果逐字重印论点是您真正想要的。正如 Jonathan Leffler 在评论中指出的那样,您将在格式字符串中使用 %s
。在这种情况下,您希望传递的参数再次成为指向字符串的指针(即您不使用 *
解引用运算符)。
EDIT2:正如 Antti Haapala 关于关闭 "Side note" 所指出的那样。
使用 C99 或 C11 时,您不必为已声明为returnint
。在这种情况下,默认值为 0
。你真的只需要在遵守 C89 标准或其他功能时这样做。为了简单起见,虽然 and/or 当不确定您的目标编译器配置是什么时,您在声明的值类型和实际 returned 值类型之间保持(类型)一致是不会错的。然后再次。 gcc -Wall
例如会让您知道。