首页 > 解决方案 > 在 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);
}

标签: ccommand-line

解决方案


您在评论中指出了许多问题:

您不能对字符串参数进行数字比较。(您在 C 中读取的所有内容都是字符数据)您必须将参数从字符串转换为数值。您可以转换为整数类型或浮点类型。如评论中所述,对于每次转换,您都必须验证转换是成功还是失败,然后确定如何处理失败的转换。

从字符串转换为数字的选择是使用sscanf()它通过检查返回以查看它是否与请求的转换次数匹配来提供最小的成功/失败指示。您还可以使用strtol()strtoul()和函数分别转换为、strtof()和。这些提供了最好的错误检测能力,但也需要一些额外的代码行来完成它。1strtod()longunsigned longfloatdouble

一个最小的例子使用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看到正确的用法,实现留给你。


推荐阅读