给定输入,例如:
6 2
1 2 3 4 5 6
4 3 3 4 5 6
其中第一行中的第一个数字是行中的变量数,第二个是行数。怎么可能只获得第一个n/2
值,n
一行中的值的数量在哪里并跳到下一行?
如果输入长度没有变化(例如,6 个数字,如您的示例),您可以使用以下命令读取所需的输入:
scanf("%d %d %d", ...);
然后,处理其余的输入:
while ((ch = getchar()) != '\n' && ch != EOF);
如果输入长度确实不同,则必须将其读入缓冲区。然后您可以遍历字符串以找到其中的空格数(因此 n = 空格 + 1),然后再次使用strtok
n/2 次迭代以获得前 n/2 个数字。
我很惊讶没有人提到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 数据执行此操作,因为这些数字不会占用相同数量的空间。
以前,你知道一行有多少个数字吗?如果你的回答是肯定的,我建议你试试这个:
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] );