【问题标题】:How to exclude arguments passed from command prompt argc argv in C? [duplicate]如何排除从 C 中的命令提示符 argc argv 传递的参数? [复制]
【发布时间】:2013-11-24 05:42:18
【问题描述】:

我需要添加用户通过命令提示符给出的分数格式

a/b b/c

我以为我可以这样做:

n1 = atoi(argv[1]);
d1 = atoi(argv[3]);
n2 = atoi(argv[4]);
d2 = atoi(argv[6]);

从而跳过斜杠,但这只会使程序崩溃。有什么方法可以跳过通过命令提示符作为参数传递的某些字符?提前谢谢你。

【问题讨论】:

标签: c function parameters argv argc


【解决方案1】:

a/b b/c

它只是在参数列表中创建了 2 个条目,一个是 a/b,另一个是 b/c

所以,argv[0]argv[1]argv[2] 是有效的,argc3

空格对于分隔参数很重要(除非您将条目包装在 "" 中)

【讨论】:

    【解决方案2】:

    如果用户写:

    add_fractions 1/2 2/3
    

    那么你的程序只有 3 个参数:

    argv[0] = "add_fractions"
    argv[1] = "1/2"
    argv[2] = "2/3"
    argv[3] = 0
    

    argc 是 3。

    你必须做这样的事情(在检查你得到了 2 个参数之后):

    char *ptr;
    n1 = atoi(argv[1]);
    if ((ptr = strchr(argv[1], '/') != 0)
        d1 = atoi(ptr+1);
    else
        d1 = 1;
    n2 = atoi(argv[2]);
    if ((ptr = strchr(argv[2], '/') != 0)
        d2 = atoi(ptr+1);
    else
        d2 = 1;
    

    或者您可以将重复的语句序列打包到一个函数中(逻辑稍有不同):

    void read_fraction(char const *str, int *num, int *den)
    {
        char *ptr;
        *num = atoi(str);
        if ((ptr = strchr(str, '/') == 0)
            ptr = "/1";
        *den = atoi(ptr+1);
    }
    

    main():

    read_fraction(argv[1], &n1, &d1);
    read_fraction(argv[2], &n2, &d2);
    

    您可能需要考虑验证;如果字符串的第一部分没有数字,则分子变为 0,但如果有斜线并且斜线后面没有数字,则分母变为 0,这可能不是您想要的。如果atoi(ptr+1) 的值为0,则将分母设置为1。这是一种逃避,但可以防止猖獗的崩溃。或者你可以在函数体中使用另一个完全不同的实现:

    int read_fraction(char const *str, int *num, int *den)
    {
        if (sscanf(str, "%d/%d", num, den) != 2)
            return -1;
        return 0;
    }
    

    然后签到main():

    if (read_fraction(argv[1], &n1, &d1) == 0 &&
        read_fraction(argv[2], &n2, &d2) == 0)
        ...process valid fractions...
    else
        ...make appropriate comments about how to use the program...
    

    从几个角度来看,使用函数“更好”。在The Pragmatic Programmer 中称为 DRY 原则:Don't Repeat Yourself。

    Kernighan 和 Plauger 在他们的书 The Elements of Programming Style 中巧妙地总结了这一点:

    • 子例程调用允许我们总结参数列表中的不规则之处,我们可以快速看到发生了什么。
    • 子程序本身总结了代码的规律,所以不需要使用重复的模式。

    【讨论】:

    • +1 但您能否解释一下您所说的替代方法是什么意思将序列打包到一个函数中
    • @legends2k:查看更新。
    • 感谢您的更新。不应该是“unpack函数中的序列”吗?
    • 我的意思是“将 N 语句的重复序列打包到一个函数中”,所以正确的动词是“打包”(将代码写出两次内联作为原始代码将正在拆包)。如果您认为它是“在函数中解压缩参数字符串”,那么“解压缩”就成为正确的动词。
    • 前者是代码,后者是数据;现在知道了,谢谢! :)
    猜你喜欢
    • 2020-01-23
    • 2020-06-26
    • 2019-09-16
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多