【问题标题】:Scanf two numbers at a time from stdout从标准输出一次扫描两个数字
【发布时间】:2015-04-23 02:54:38
【问题描述】:

我有一个程序可以将一个巨大的整数数组输出到标准输出,每个整数在一行中。例如:

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) 一次读取所有行。但是要执行我想要的逻辑,我需要一次读取两行并用它们进行计算,我不知道如何。

【问题讨论】:

  • 在每个循环迭代中调用两次scanf() 怎么样?
  • 您不必在每次迭代中读取两个数字。您开始阅读两个数字。之后,算法一次只读取一个数字,首先将先前迭代的num2 提升为num1,从标准输入重新填充num2,等等。通过输出num2 完成。
  • @WhozCraig 我是个白痴。有一种更简单的方法可以做到这一点。抓取文件中的第一个数字,抓取最后一个数字,从第一个数字开始循环,直到到达最后一个数字并每次输出循环计数器。但现在的问题是,如何从 stdout 中获取第一个和最后一个数字?
  • 第一个数字很简单;你读了它。最后一个数字也很简单;你记住你读的最后一个数字,并继续读新的数字,直到输入失败,当你得到一个新的数字时更新最后一个读的数字。
  • ...并确保您确实阅读了至少 两个 数字。只有一个数字的文件应被视为错误状态或范围为一。由你决定。

标签: c scanf scanning


【解决方案1】:

您总是可以从文件中读取第一个和最后一个数字,然后打印中间的所有内容。

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 );
}

【讨论】:

  • 如此简单! +1
【解决方案2】:

先阅读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  

【讨论】:

    【解决方案3】:

    虽然您可以阅读 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 以符合您预期的数据范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多