2016-02-14 31 views
2

我想在兩行一樣讀取兩個整數:從STDIN讀取不同行上變量的簡單方法?

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給變量賦值來自一個數組。

回答

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

如果你能在你的代碼,試圖實現一個數組:

fscanf(STDIN, "%d\n", $n); 

$num=array(); 
while($n--){ 
    fscanf(STDIN, "%d\n", $num[]); 
} 
print_r($num);