正在跳过DLang数组中的第一个argv
我开始学习D。我写了一些基本的程序(hello world…添加2个Numbers),现在是我的第三个。它应该采用一个数字数组并将它们相加。我有以下代码:正在跳过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
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:
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)继续,您可能只想说
循环中的code>也可以跳过它。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)继续,您可能只想说循环中的code>也可以跳过它。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中。整洁的我试试看。谢谢这可能比每次进行指数比较要好。