读入数字直到遇到换行符

Read in digits until a newline character is hit

我有一个如下所示的文本文件:

12345678909876543211234567890
09876543122345678900

我最终需要使用单独的堆栈将这两个值加在一起,所以我想将每个数字分别压入堆栈,所以我有如下代码:

test=fopen("test.txt","r");
while (!feof(fp)) {
    fscanf(test, "%1d", &number);
    Push((Item)number, &num1);
}

虽然我需要修改我的代码,以便它一次读取第一行 1 个数字,压入每个数字,然后对于下一行,我需要它压入另一个名为 num2 的堆栈而不是您在当前代码中看到的 num1

您没有告诉我们有关堆栈类型的信息,所以我发明了一个 — typedef 名称是 Stack:

Stack num1, num2;
Stack *stacks[2] = { &num1, &num2 };

…initialize stacks
…open file and check that the open was successful

for (int i = 0; i < 2; i++)
{
    char line[4096];
    if (fgets(line, sizeof(line), test) == 0)
        …report unexpected EOF or other error; do not continue…
    char *digit = line;
    while (isdigit((unsigned char)*digit))
        Push((Item)(*digit++ - '0'), stacks[i]);
    if (*digit != '\n' && *digit != '[=10=]')
        …report unexpected (non-digit) data on input; do not continue;
}

我假设 Push 是一个函数,而不是一个可能多次计算其第一个参数的宏。如果是这样的宏,需要将循环体拆分成两行,加上大括号,使digit的增量与函数调用分开。

请注意,此方法的一个主要优点是您拥有可用于错误报告的整行数据,这通常比仅能够报告错误后遗留下来的点点滴滴更容易让人们理解scanf() 循环从行中读取了半不确定数量的字符。如果需要,您甚至可以在线上使用 sscanf() — 请参阅 How to use sscanf() in loops?