正在跳过DLang数组中的第一个argv

正在跳过DLang数组中的第一个argv,d,D,我开始学习D。我写了一些基本的程序(hello world…添加2个Numbers),现在是我的第三个。它应该采用一个数字数组并将它们相加。我有以下代码: import std.stdio; import std.algorithm; import std.string; import std.conv; int main(string[] argv) { int sum; foreach (int i, string s; argv) { write

我开始学习D。我写了一些基本的程序(hello world…添加2个Numbers),现在是我的第三个。它应该采用一个数字数组并将它们相加。我有以下代码:

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]
是脚本名

  • 为什么?

  • 我怎么告诉它跳过第一个呢?我可以告诉它跳过所有非数字输入,但如果索引大于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;
        }
    }
    
    导入标准stdio;
    导入标准算法;
    输入标准字符串;
    进口标准conv;
    int main(字符串[]argv)
    {
    if(argv.length 0)//跳过第一个argv。它是脚本名。
    {
    如果(是数字){
    总和+=至!int(s);
    }否则{
    writeln(“请只输入数字。例如:\n\t”,argv[0],“[number][number][number]”;
    返回1;
    }
    }
    }
    书面(总和);
    返回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;
        }
    }
    
    导入标准stdio;
    导入标准算法;
    输入标准字符串;
    进口标准conv;
    int main(字符串[]argv)
    {
    if(argv.length 0)//跳过第一个argv。它是脚本名。
    {
    如果(是数字){
    总和+=至!int(s);
    }否则{
    writeln(“请只输入数字。例如:\n\t”,argv[0],“[number][number][number]”;
    返回1;
    }
    }
    }
    书面(总和);
    返回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 .. $]) 
    

    尽管如此,当argv==1时,我也将是offset-i==0,所以如果(i==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 .. $]) 
    

    尽管如此,当argv==1时,我也将是offset-i==0,所以如果(i==0)继续,您可能只想说
    也可以跳过它。

    1)因为它是,2)如果(i==0)继续,则
    为什么会这样有一个惯例吗?你应该看看。它是标准库的一部分,使解析命令行参数变得更容易。1)因为它是,2)如果(i==0)继续,则
    为什么会这样有一个惯例吗?你应该看看。它是标准库的一部分,使解析命令行参数变得更加容易。我决定不对它进行切片,以便在它们出错时可以在输出中打印程序名。但是我考虑过这个问题。如果你在循环中直接切片,你仍然可以从外部访问完整的内容-使用我的foreach行,
    argv[0]
    仍然指程序名,它只是不包括在
    int I,string s
    loop.Oh中。整洁的我试试看。谢谢这可能比每次进行索引比较要好。我决定不进行切片,这样,如果他们做错了,我就可以在输出中打印程序名。但是我考虑过这个问题。如果你在循环中直接切片,你仍然可以从外部访问完整的内容-使用我的foreach行,
    argv[0]
    仍然指程序名,它只是不包括在
    int I,string s
    loop.Oh中。整洁的我试试看。谢谢这可能比每次进行指数比较要好。