跳过 DLang 数组中的第一个 argv

Skipping first argv in DLang array

我开始学习 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,我可能想出错?

这是一个答案...不确定这是否是最好的方法:

只检查索引是否大于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;
    }
}

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 .. $]) 

虽然 i 也会偏移 - 当 argv == 1 时 i == 0,因此您可能只想在循环中说 if(i == 0) continue; 并跳过它。