2012-11-22 52 views
4

给定的输入样被得到:忽略行的其余部分一旦输入已用C

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

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

+0

你能说说吗?问题不清楚,你想要什么类型的int或char或所有类型 – Omkant

+0

im需要的类型是Int – asnewbie

+3

提前不知道'n',你不能读取n/2项* only *,不能超过当我告诉你这是我妻子的一半时,你可以确信我的侄女年龄。你需要知道'n',并且由于'n'是(linelength-1)/ 2来计算结束换行符,所以你需要读取整行。您选择保留的*相关*数据完全取决于您。 – WhozCraig

回答

3

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

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数据来做这件事,因为这些数字不占用统一的空间。

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

如果输入长度不改变(例如,6号喜欢你的例子),你可以使用读取所需的输入:

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

然后,处理输入的其余部分:

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

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

+0

可能值得注意的是,在你的第一个代码片段中的'...'并不意味着'...',而是“你的变量在这里”。 –

相关问题