我开始学习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 :(得分:5)
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时i == 0,所以你可能只想在循环中说if(i == 0) continue;
以跳过它。
答案 1 :(得分:1)
这是一个答案......不确定这是否是最佳方式:
只需检查索引是否大于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;
}
}