给定的输入样被得到:忽略行的其余部分一旦输入已用C
6 2
1 2 3 4 5 6
4 3 3 4 5 6
凡在 第一行第一数目的在行变量数,第二个是行数。 如何才能获得第一个n/2
值,其中n
是一行中的值的数量并跳到下一行?
给定的输入样被得到:忽略行的其余部分一旦输入已用C
6 2
1 2 3 4 5 6
4 3 3 4 5 6
凡在 第一行第一数目的在行变量数,第二个是行数。 如何才能获得第一个n/2
值,其中n
是一行中的值的数量并跳到下一行?
我很惊讶,没有人提到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数据来做这件事,因为这些数字不占用统一的空间。
以前,你知道一行中有多少个数字吗?如果你的答案是肯定的,我建议你试试这个:
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]);
如果输入长度不改变(例如,6号喜欢你的例子),你可以使用读取所需的输入:
scanf("%d %d %d", ...);
然后,处理输入的其余部分:
while ((ch = getchar()) != '\n' && ch != EOF);
如果输入长度确实变化,你必须把它读入缓冲区。然后,您可以迭代字符串以查找其中的空格数(So n = spaces + 1),然后使用strtok
n/2次再次迭代以获得前n/2个数字。
可能值得注意的是,在你的第一个代码片段中的'...'并不意味着'...',而是“你的变量在这里”。 –
你能说说吗?问题不清楚,你想要什么类型的int或char或所有类型 – Omkant
im需要的类型是Int – asnewbie
提前不知道'n',你不能读取n/2项* only *,不能超过当我告诉你这是我妻子的一半时,你可以确信我的侄女年龄。你需要知道'n',并且由于'n'是(linelength-1)/ 2来计算结束换行符,所以你需要读取整行。您选择保留的*相关*数据完全取决于您。 – WhozCraig