一旦输入已经在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] );