在DLang数组中跳过第一个argv

Jef*_*eff 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 为什么?

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

Ada*_*ppe 5

argv[0]始终是调用程序的名称,它是D继承的C标准的一部分.如果你有一个程序可以在命令行上通过多个名称调用它很有用 - 它可以帮助你知道用户想要什么,因为一个程序可能是几个命令(参见C程序busybox的一个很好的例子,一个程序包含几个常见的unix命令).您也可以像使用它一样将它用于帮助屏幕.

它是args的一部分的原因是命令行是这样的:program foo bar- 程序名是该行上给出的第一个东西,所以它也是args中的第一件事.

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

foreach (int i, string s; argv) 
Run Code Online (Sandbox Code Playgroud)

可以变成

foreach (int i, string s; argv[1 .. $]) 
Run Code Online (Sandbox Code Playgroud)

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