跳过 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]
是脚本名称。
为什么?
如何让它跳过第一个?我可以告诉它跳过所有非数字输入,但如果索引大于 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;
并跳过它。
我开始学习 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]
是脚本名称。
为什么?
如何让它跳过第一个?我可以告诉它跳过所有非数字输入,但如果索引大于 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;
并跳过它。