4

给定输入,例如:

6 2
1 2 3 4 5 6
4 3 3 4 5 6 

其中第一行中的第一个数字是行中的变量数,第二个是行数。怎么可能只获得第一个n/2值,n一行中的值的数量在哪里并跳到下一行?

4

3 回答 3

4

如果输入长度没有变化(例如,6 个数字,如您的示例),您可以使用以下命令读取所需的输入:

scanf("%d %d %d", ...);

然后,处理其余的输入:

while ((ch = getchar()) != '\n' && ch != EOF);

如果输入长度确实不同,则必须将其读入缓冲区。然后您可以遍历字符串以找到其中的空格数(因此 n = 空格 + 1),然后再次使用strtokn/2 次迭代以获得前 n/2 个数字。

于 2012-11-22T18:30:15.907 回答
3

我很惊讶没有人提到fscanf("%*d")- 该*符号告诉fscanf读取一个整数值,但忽略它(请参阅此处的文档)。这使您可以执行以下操作:

int numbers[MAX_NUMS];
int n = numbers_in_line();
for( i = 0; i < n; i++ )
   if(i<n/2)
      fscanf("%d", &numbers[i]);
   else
      fscanf("%*d");

这似乎比仅阅读其余字符更清晰。如果你n提前知道,你也可以写:

scanf("%d %d %d %*d %*d %*d",&numbers[0],&numbers[1],&numbers[2]);

您没有直接询问这个问题,但是如果您正在读取二进制数据,还有另一种方法可以跳过该行的其余部分。您可以读取您想要的数据,然后计算下一行开头的位置(这里是一些指针算法)并使用该fseek函数跳转到该位置,这可以节省一些 I/O 时间。不幸的是,您不能对 ASCII 数据执行此操作,因为这些数字不会占用相同数量的空间。

于 2012-11-22T18:56:41.343 回答
0

以前,你知道一行有多少个数字吗?如果你的回答是肯定的,我建议你试试这个:

int n = numbersInALine(); 
int i = 0;
int *numbers = (int*) malloc( sizeof( int ) * ( n / 2 ) );
for( i = 0; i < n/2; i++ )
    scanf( "%d", &numbers[i] );
于 2012-11-22T18:26:30.353 回答