一旦输入已经在C中获得,则忽略该行的其余部分

给出如下输入:

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

第一行中的第一个数字是行中的变量数,第二个是行数。 如何才能获得前n/2值,其中n是一行中的值的数量并跳到下一行?

我很惊讶没有人提到fscanf("%*d")*符号告诉fscanf读取整数值,但要忽略它(请参阅此处的文档)。 这可以让你做类似的事情:

 int numbers[MAX_NUMS]; int n = numbers_in_line(); for( i = 0; i < n; i++ ) if(i 

这看起来比仅仅阅读其余的字符更清晰。 如果你提前知道,你也可以写:

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

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

如果输入长度不变(例如,6个数字,如您的示例),您可以使用以下方法读取所需的输入:

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

然后,处理剩下的输入:

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

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

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

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