【问题标题】:Read in digits until a newline character is hit读入数字,直到遇到换行符
【发布时间】:2015-10-13 23:39:28
【问题描述】:

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

12345678909876543211234567890
09876543122345678900

我最终需要使用单独的堆栈将这两个值相加,因此我想将每个数字分别推入堆栈,因此我的代码如下:

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

我需要修改我的代码,以便它一次读取第一行 1 个数字,推入每个数字,然后对于下一行,我需要将它推入另一个名为 num2 而不是 @987654327 的堆栈@ 就像你在当前代码中看到的那样。

【问题讨论】:

  • @user3121023 不会将它们扫描为字符吗?
  • 读取一行数据;将数字压入堆栈。阅读下一行;将数字压入另一个堆栈。使用标准 C 函数 fgets() 或 POSIX 函数 getline() 读取行。
  • @user3121023 您的方法工作正常,我现在可以使用它。随意提交答案,我可以接受。

标签: c io scanf


【解决方案1】:

你还没有告诉我们堆栈类型,所以我发明了一个——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 != '\0')
        …report unexpected (non-digit) data on input; do not continue;
}

我假设Push 是一个函数,而不是一个可能不止一次评估其第一个参数的宏。如果是这样的宏,则需要将循环体分成两行并添加大括号,以便digit的增量与函数调用分开。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多