我想在两行读取两个整数,如:
4
5
此代码有效:
fscanf(STDIN,"%d",$num);
fscanf(STDIN,"%d",$v);
但我想知道是否有更短的方式来写这个? (对于更多变量,我不想为每个变量写一个语句)例如:
//The following two lines leaves the second variable to be NULL
fscanf(STDIN,"%d%d",$num,$v);
fscanf(STDIN,"%d\n%d",$num,$v);
更新:我使用答案中提供的方法解决了这个问题,读取数组并list
从数组中分配变量。
答案 0 :(得分:2)
考虑这个例子:
<?php
$formatCatalog = '%d,%s,%s,%d';
$inputValues = [];
foreach (explode(',', $formatCatalog) as $formatEntry) {
fscanf(STDIN, trim($formatEntry), $inputValues[]);
}
var_dump($inputValues);
用
执行和喂食时1
foo
bar
4
你会得到这个输出:
array(4) {
[0] =>
int(1)
[1] =>
string(3) "foo"
[2] =>
string(3) "bar"
[3] =>
int(4)
}
底线:你当然可以使用循环或类似的东西,这可以缩短你的代码。最重要的是它简化了维护。但是,如果要指定每次迭代时要读取的格式,则需要在某处指定该格式。这就是缩短代码的原因......
如果您不想要处理不同类型的输入格式,情况会有所不同。在这种情况下,您可以使用通用循环:
<?php
$inputValues = [];
while (!feof(STDIN)) {
fscanf(STDIN, '%d', $inputValues[]);
}
var_dump($inputValues);
现在,如果你用
喂它1
2
3
在标准输入上然后分离输入(例如按CTRL-D),然后你得到的输出是:
array(3) {
[0] =>
int(1)
[1] =>
int(2)
[2] =>
int(3)
}
相同的代码显然可用于输入重定向,因此您可以将文件提供给脚本,这使得分离标准输入过时...
答案 1 :(得分:1)
如果你可以在你的代码中尝试实现一个数组:
fscanf(STDIN, "%d\n", $n);
$num=array();
while($n--){
fscanf(STDIN, "%d\n", $num[]);
}
print_r($num);