c - 在 C 中的一组命令行参数中查找最大的数字
问题描述
我刚开始编码并尝试用 C 编写一个简单的程序来查找一组命令行参数中的最高数字。我遇到的问题是,它似乎总是认为命令行中给出的数字太长了。例如运行 './highest 4' 得到结果 32765。
将代码替换为 "printf("%i %i %i\n", argv[1], argv[2], argv[3]);" 表明这正在发生。例如“./highest 1 2 3”输出“32765 -975773016 32765”——更令人困惑的是,每次运行程序时这些值都会发生变化。无论如何,我很难过。这是代码:
#include <stdio.h>
int main(int argc, int argv[])
{
int highest = argv[1];
for (int i = 1; i < argc; i++)
{
if (argv[i] > highest);
{
highest = argv[i];
}
}
printf("%i\n", highest);
}
解决方案
您在评论中指出了许多问题:
main()
See: C11 Standard - §5.1.2.2.1 Program startup(p1)的无效声明。另请参阅:main() 在 C 和 C++ 中应该返回什么?在独立环境中,程序启动时调用的函数的名称和类型是实现定义的。请参阅:C11 标准 - 5.1.2.1 独立环境argv
是一个指针数组,char
其中最后一个有效参数之后的下一个指针被设置NULL
为哨兵。(这意味着您可以遍历指针,直到您阅读NULL
)。
您不能对字符串参数进行数字比较。(您在 C 中读取的所有内容都是字符数据)您必须将参数从字符串转换为数值。您可以转换为整数类型或浮点类型。如评论中所述,对于每次转换,您都必须验证转换是成功还是失败,然后确定如何处理失败的转换。
从字符串转换为数字的选择是使用sscanf()
它通过检查返回以查看它是否与请求的转换次数匹配来提供最小的成功/失败指示。您还可以使用strtol()
、strtoul()
和函数分别转换为、strtof()
和。这些提供了最好的错误检测能力,但也需要一些额外的代码行来完成它。1strtod()
long
unsigned long
float
double
一个最小的例子使用sscanf()
可以写如下。如果任何参数未能转换为int
,则会发出诊断信息,指示失败的参数是什么,但否则不会影响找到max
给定参数的最高 ( ) 的逻辑。
您还必须考虑如何处理用户不提供参数的情况。
#include <stdio.h>
#include <limits.h> /* for INT_MIN */
int main (int argc, char **argv) {
int max = INT_MIN; /* initialize max to lowest integer in range of int */
if (argc == 1) { /* validate args provided (recall argv[0] is program name) */
fputs ("error: no arguments provided.\n"
"usage: ./program number number [...]\n", stderr);
return 1;
}
for (int i = 1; i < argc; i++) { /* loop over all arguments */
int n = 0; /* int to hold arg conversion */
if (sscanf (argv[i], "%d", &n) == 1) { /* convert arg to int/validate */
if (n > max) /* if good int, compare against max */
max = n; /* update max if n is larger */
}
else /* conversion failed */
fprintf (stderr, "error: not an integer '%s'\n", argv[i]);
}
printf ("\nmax of arguments: %d\n", max);
}
示例使用/输出
提供的所有整数:
$ ./bin/max_of_args 1 -5 10 3 12 2
max of arguments: 12
使用不是整数的参数:
$ ./bin/max_of_args 1 my -5 dog 10 has 3 fleas 12 bummer 2
error: not an integer 'my'
error: not an integer 'dog'
error: not an integer 'has'
error: not an integer 'fleas'
error: not an integer 'bummer'
max of arguments: 12
未提供任何参数:
$ ./bin/max_of_args
error: no arguments provided.
usage: ./program number number [...]
看看事情,如果你有问题,请告诉我。
脚注:
1.strtol()
你可以在man 3 strtol看到正确的用法,实现留给你。
推荐阅读
- ide - WebStorm HTML 文件显示 HTML 元素的 TypeScript 错误
- java - 单击后退按钮时如何返回主活动?
- redux - Angular 6 ngrx - 如何在 ShopModule.forRoot 中使用多个减速器
- linux - 从 PDF 转换为 PNG:平滑渐变获得可见边缘
- android - Android - 在 Web 表单中为 POST 获取隐藏值
- ibm-watson - Watson Assistent 中的对话节点和意图问题
- ansible - 无法从数据库中获取 gitlab runners 注册令牌
- c# - System.Web.HttpParseException:'“@”字符后出现意外的“{”
- mongodb - MongoDB-备份和恢复用户和角色
- python - 是什么导致 Google BigQuery 查询的开销如此之大?