c - 在 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
会告诉你:
警告:格式 '%d' 需要类型为 'int' 的参数,但参数 2 的类型为 'char *' [-Wformat=] printf("%d\n", argv[i]);
这实际上是一个非常可靠的提示。
附带说明:如果你声明你的main
as int
,你也应该返回一个。;)(但有关详细信息,请参阅 EDIT2)。
编辑:我想我应该在第二段中提到实际输出惊喜。
如果逐字转载论点是您真正想要的。正如Jonathan Leffler在评论中指出的那样,您将%s
在格式化字符串中使用。在这种情况下,您希望传递的参数再次成为指向字符串的指针(即您不使用取消引用运算符)。*
EDIT2:正如Antti Haapala关于结束“旁注”所指出的那样。
使用 C99 或 C11 时,您不必为已声明为 return的main
(我们正在谈论的)显式返回(一个值) 。在这种情况下,将假定为默认值。你真的只需要在遵守 C89 标准或其他功能时这样做。尽管为了简单起见和/或当不确定您的目标编译器配置是什么时,在声明的值类型和实际返回的值类型之间保持(类型)一致不会是错误的。然后再次。例如会让你知道这一点。main
int
0
gcc -Wall
推荐阅读
- javascript - .clone().json() 在 javascript 中是什么?
- opencv - AffineWarper 类中的 opencv warpPoint 函数产生奇怪的输出
- android - 如何改进我的动画并使其均匀(Jetpack Compose)?
- nestjs - Nestjs:无法异步连接mongo
- python - Django 查询多对多
- node.js - 从另一个控制器调用控制器是一个坏主意吗?
- cakephp - 如何查询与特定联接表条目关联的数据?
- android - 房间更新不起作用(尝试了许多变化)
- maven - maven-dependency-plugin 复制的依赖项的 jar-s 未安装到本地存储库
- javascript - Kotlin - 将 JavaScript 注入 WebView 以填写表单