在DLang数组中跳过第一个argv

时间:2015-08-13 13:19:39

标签: d

我开始学习D.我写了几个基本的程序(你好世界......加2个麻木),然后我就读到了第三个程序。它应该采用一组数字并将它们加在一起。我有以下代码:

import std.stdio;
import std.algorithm;
import std.string;
import std.conv;

int main(string[] argv)
{
    int sum;
    foreach (int i, string s; argv) 
    {
        writefln("argv[%d] = '%s'", i, s);
        if (isNumeric(s)){
            sum += to!int(s);
        } else {
            writeln("Please only input numbers. ex:\n\t", argv[0], " [number] [number] [number]");
            return 1;
        }
    }
    writeln(sum);
    return 0;
}

我遇到的问题是argv[0]是脚本名称。

  1. 为什么?

  2. 如何告诉它跳过第一个?我可以告诉它跳过所有非数字输入,但是如果索引大于0,我可能想要输出错误?

2 个答案:

答案 0 :(得分:5)

argv[0]始终是调用程序的名称,它是D继承的C标准的一部分。如果您有一个可以在命令行上由多个名称调用的程序,它会很有用 - 它可以帮助您了解用户想要的内容,因为一个程序可能是多个命令(请参阅C程序busybox以获取一个大的示例其中,一个程序包含几个常见的unix命令)。您也可以像使用它一样将它用于帮助屏幕。

它是args的一部分的原因是命令行类似于:program foo bar - 程序名是该行上给出的第一件事,所以它也是args中的第一件事。

但要跳过它,你可以在循环之前将其切掉:

foreach (int i, string s; argv) 

可以成为

foreach (int i, string s; argv[1 .. $]) 

虽然,然后我也会偏移 - 当argv == 1时i == 0,所以你可能只想在循环中说if(i == 0) continue;以跳过它。

答案 1 :(得分:1)

这是一个答案......不确定这是否是最佳方式:

只需检查索引是否大于0:

import std.stdio;
import std.algorithm;
import std.string;
import std.conv;

int main(string[] argv)
{
    if (argv.length <= 2){
        writeln("Type numbers after the script to add them together. ex:\n\t", argv[0], " [number] [number] [number]");
        return 0;
    } else {
        int sum;
        foreach (int i, string s; argv) 
        {

            if (i > 0) // skip the first argv. it is the script name.
            {
                if (isNumeric(s)){
                    sum += to!int(s);
                } else {
                    writeln("Please only input numbers. ex:\n\t", argv[0], " [number] [number] [number]");
                    return 1;
                }
            }
        }
        writeln(sum);
        return 0;
    }
}