【问题标题】:Properly Using EOF in C在 C 中正确使用 EOF
【发布时间】:2011-06-01 04:14:09
【问题描述】:

我是编程新手,我真的很想学习编写一个像样的程序。我不确定如何使用 EOF。我的程序已编译,当我运行它时,它工作正常,除了 EOF 部分。该程序应该向主函数返回一个 -1 值(在使用 CTRL+z 之后),并将打印一条语句然后关闭程序。 -1 与 EOF 本身的 -1 不同。

 #include <stdio.h>
//Function Declaration
int inputFunction (int num);

int main (void)
{
    //Local Declarations
    int num;
    do
    {    
    inputFunction (num);

    if (num < 0 || num > 100)
            inputFunction (num);
    else
        inputFunction (num);
    }while (num != -1);
    return 0;
}
int inputFunction (int num)
{
    int rc;

    do
    {
    printf("Enter an integer from 0 to 100: \n");
    rc = scanf("%d", &num);
       {
       if (rc != EOF)
              {
              if (num < 0 || num >100)
                 {
                 printf("ERROR\n");
                 return num;
                 }
              else
                  {
                 return num;
                 }
              }
       else
           {
           num = -1;
           return num;
       }
       }  
    }while (rc != EOF);
    }

【问题讨论】:

  • @orangepage 试试int inputFunction (int&amp; num);
  • @Red:我怀疑对于有这样问题的人来说,指针可能有点太高级了。
  • @Red 这是 C 而不是 C++,没有这样的东西。
  • @Wiz OP 未能正确标记它。
  • @Red 我不敢苟同,它使用 stdio.h 而不是 cstdio 并且仅使用 c 函数(printf/scanf/EOF vs cout/>>>/npos)。你是怎么得出这个结论的?

标签: c eof do-while if-statement


【解决方案1】:

变量num 从未在main 中赋值。您调用inputFunction 并返回一个值,但您忽略它返回的值。

【讨论】:

    【解决方案2】:

    CTRL-Z (^Z) 的 ASCII 值是 26(十进制)。 value 不作为参考,所以当你比较它时它会包含垃圾值。

    【讨论】:

      【解决方案3】:

      正如 Gabe 所说,您需要分配 inputFunction() 的返回值才能使用它 - 因为函数中的变量具有 local 范围。因此,每次在 main() 中调用 inputFunction() 时,都应该这样做:

      num = inputFunction(num);
      

      否则当程序执行返回main()时,inputFunction()中的num的值会丢失。这是您的程序未按预期执行的主要原因。

      您的代码也存在一些逻辑问题。在 main() 中的第一个 if/else 语句中,两个语句产生完全相同的结果。其他行为可能也不完全是您想要做的。

      我认为您可能会受益于用笔和纸计划您希望程序执行的操作。一种方法是“绘制”程序将如何处理箭头等(流程图)。或者您可以从 1-2 句话的目标描述开始,然后逐渐将其扩展为越来越详细的内容,直到您拥有程序将执行的一系列任务,然后您可以将其转换为代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 2012-12-16
        • 2015-06-09
        • 2013-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多