2015-04-23 26 views
1

我有一個程序,輸出一個巨大的整數數組到標準輸出,每一個整數在一行中。例如:從標準輸出一次掃描兩個數字

103 
104 
105 
107 

我需要編寫另一個程序,讀取該數組並填充數字不是前一個數字的1的增量的空格。數字之間的唯一區別是2(105,107),這使得它更容易。

這是我的代碼做的邏輯:

printf("d",num1); 

if ((num2-num1) != 1) 
    numbetween = num1 + 1; 
    printf("%d", numbetween); 
    printf("%d", num2); 
else(
    printf("%d",num2); 
) 

所以這個程序的輸出現在是:

103 
104 
105 
106 
107 

我的問題是閱讀的數字。我知道我可以做while (scanf("%hd", &num) != EOF)一次讀取所有行。但爲了做我想要的邏輯,我需要一次讀兩行,並與他們進行計算,我不知道如何。

+0

如何在每個循環迭代上執行兩次'scanf()'調用? –

+3

您不必在每次迭代中讀取兩個數字。你*通過閱讀兩個數字開始*。之後,算法一次只讀取一個數字,促進先前迭代的'num2'首先是'num1',從標準輸入重新填充'num2'等。通過輸出'num2'結束。 – WhozCraig

+0

@WhozCraig我當時是個白癡。這樣做有一個更簡單的方法。抓住文件中的第一個數字,獲取最後一個數字,從第一個數字開始循環,直到您到達最後一個數字並每次輸出循環計數器。但現在的問題是,我如何從stdout中獲取第一個和最後一個數字? – user3011338

回答

1

閱讀第一num然後如果需要的話,當你閱讀下一int

#include <stdio.h>                
#include <stdlib.h>                

int main()                  
{                    
    int previous = 0;               
    int num;                 
    scanf("%hd", &previous);             

    while (scanf("%hd", &num) != EOF) {           
     for (int i = previous; i < num; i++) {         
      printf("%d\n" , i);             
     }                  
     previous = num;               
    }                   
    printf("%d\n" , previous);             

    return 0;                 
} 

此輸入

100 
102 
103 
105 
107 
110 

返回此輸出

100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
2

你總是可以只讀取第一個添加缺少的和文件中的最後一個數字,然後打印每個文件之間的事情。

int main(void) 
{ 
    // get the first value in the file 
    int start; 
    if (scanf("%d", &start) != 1) 
     exit(1); 

    // get the last value in the file 
    int end = start; 
    while (scanf("%d", &end) == 1) 
     ; 

    // print the list of numbers 
    for (int i = start; i <= end; i++) 
     printf("%d\n", i); 
} 
+0

爲了這麼簡單! +1 – chux

1

雖然你可以閱讀firstlast,填補範圍內,你真正做的是尋找minmax和包含性地打印它們之間的所有值。在名稱下方留下firstlast,但它們代表minmax,並且將覆蓋您的範圍,而不管這些值是否按順序輸入。考慮到這,另一種方法確保你蓋的int範圍的限制是:

#include <stdio.h> 

int main (void) { 

    int num = 0; 
    int first = (1U << 31) - 1; /* INT_MAX */ 
    int last = (-first - 1);  /* INT_MIN */ 

    /* read all values saving only first (min) and last (max) */   
    while (scanf (" %d", &num) != EOF) { 
     first = num < first ? num : first; 
     last = num > last ? num : last; 
    } 

    /* print all values first -> last */   
    for (num = first; num <= last; num++) 
     printf ("%d\n", num); 

    return 0; 
} 

輸入

$ cat dat/firstlast.txt 
21 
25 
29 
33 
37 
41 
45 
49 
53 
57 
61 
65 
69 
73 
77 
81 
85 
89 
93 
97 
101 

輸出

$ ./bin/firstlast < dat/firstlast.txt 
21 
22 
23 
24 
25 
26 
27 
28 
29 
<snip> 
94 
95 
96 
97 
98 
99 
100 
101 

注意:你可以改變types以符合您預期的數據範圍。