错误:'else'没有前面的'if'和fprintf

时间:2016-04-01 13:05:19

标签: c gcc

我想在屏幕的速度索引上打印。我不是代码的作者。

代码在这里http://pastebin.com/47CbB1vb

获取行也是编译所必需的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
*   get_line:
*       Reads a line into string, returns length.
*       Kernighan & Ritchie p.69
*
*/
int
get_line(fp, line, lim)
   FILE           *fp;
   char           *line;
   int             lim;
{
   int             c, i;

   i = 0;
   while (--lim > 0 && (c = getc(fp)) != EOF && c != '\n')
      line[i++] = c;
   if (c == '\n')
   {
      line[i++] = c;
   }
   line[i] = '\0';
   if (c == EOF)
      return (-1);
   else
      return (i);
}
/*
 *  ignore_line:
 *      Gets the next line (up to and including the newline
 *      character) from the file pointed to by fptr and
 *      promptly loses it.  Taken from asc2ah.c.
 *
 *          Siggi   29.06.1990
 */
int
ignore_line(dat_fp)
   FILE           *dat_fp;
{
   char            string[256];
   char           *fgets();
   if (fgets(string, 250, dat_fp) == NULL)  /* nothing there     */
      return (-1);
   return (0);          /* there was something   */

我尝试使用gcc编译

gcc gi_line.c  vel2d.c -lm -o vel2d
vel2d.c: In function ‘main’:
vel2d.c:205:19: warning: format ‘%f’ expects argument of type ‘double’, but argument 3 has type ‘int’ [-Wformat=]
                   fprintf(stdout,"%.1f",index);
                   ^
vel2d.c:206:9: error: ‘else’ without a previous ‘if’
         else
         ^

我只包含了fprintf行。没有那行,我可以编译代码,它可以很好地工作。那么我应该改变什么呢?

1 个答案:

答案 0 :(得分:1)

以下是有问题的违规代码:

       if (xflg)
              index = m * nxy + l*nx + k;
              fprintf(stdout,"%.1f",index);
       else
          index = m * nxy + k*ny + l;

if语句的“if”和“else”部分最初各有一行,因此添加大括号并非绝对必要。但是,当您将调用添加到fprintf时,这改变了一切。

由于if之后没有大括号,index = m * nxy + l*nx + k;行包含整个if部分。后面的printf是{em>不 if的一部分,是一个单独的声明。然后,当编译器看到else时,没有对应的if,因为之前的if已完成。

这可以通过添加大括号来修复:

       if (xflg) {
              index = m * nxy + l*nx + k;
              fprintf(stdout,"%.1f",index);
       } else {
          index = m * nxy + k*ny + l;
       }

您应该始终为任何ifelseforwhiledo块添加大括号,即使正文只有一行。这可以防止这样的错误发生。

在这种情况下你很幸运,无法添加大括号导致编译器错误。如果您在此示例中没有else部分,则代码将进行编译,printf将始终运行。然后你会摸不着头脑,弄明白为什么。

对于printf警告,index属于int类型,因此您需要使用正确的格式说明符打印%d