预期标识符或'('''''''令牌[关闭]

问题描述 投票:-4回答:3

我是C的超级新手并且在最后一行不断收到此错误。我试过通过我的教科书和Google搜索并在这里查看。我认为这是一个小错误,但我似乎无法弄明白。

 /*Convert military time to standard time*/

#include <stdio.h>

int main (void)
{
    double MilitaryTime, StandardTime;
    printf("Enter a military time (0000 to 2359): \n");
    scanf("%f", &MilitaryTime);


    {
        if(MilitaryTime <= 2359)
        {
            if(MilitaryTime <= 1159)
            StandardTime = MilitaryTime/100;
            printf("The regular time is: %2f AM\n", StandardTime);
            else
            StandardTime = (MilitaryTime - 1200)/100;
            printf("The regular time is: %2f PM\n", StandardTime);
        }
        else 
        printf("Error: Please enter a number between 0000 and 2359: %f\n");
        scanf("%f", &MilitaryTime);
    }
c
3个回答
2
投票

打开和关闭{ }时需要注意。他们负责定义变量和函数的范围。再看一下功能范围。有一个很好的代码! :)

/*Convert military time to standard time*/

#include <stdio.h>

int main (void) {
  double MilitaryTime, StandardTime;
  printf("Enter a military time (0000 to 2359): \n");
  scanf("%f", &MilitaryTime);

  if(MilitaryTime <= 2359) {
      if(MilitaryTime <= 1159) {
        StandardTime = MilitaryTime/100;
        printf("The regular time is: %2f AM\n", StandardTime);
      } else {
        StandardTime = (MilitaryTime - 1200)/100;
        printf("The regular time is: %2f PM\n", StandardTime);
      }
  } else { 
    printf("Error: Please enter a number between 0000 and 2359: %f\n");
    scanf("%f", &MilitaryTime);
  }
}

1
投票

简短的回答:你的主要问题是在if和else语句之后缺少大括号{}。

更长的解释:在C中,if语句必须后跟大括号,否则只能在评估后的第一行。如果使用else语句,则必须立即跟进if。

换句话说,你想要做的是:

if CONDITION
do:
    LINE1
    LINE2
    LINE3
    ETC...
else
do:
    ELSE_LINE1
    ELSE_LINE2
    ELSE_LINE3
    ETC...

但是你告诉你的编译器是什么

if CONDITION
do:
    LINE1
Do anyway:
LINE2
LINE3
ETC...

else //This part is not defined and therefor the compiler doesn't understand 
     //you, as else must follow up right after an if

更重要的是,您还有另外两个问题:

一,您使用%f格式扫描double类型的变量。 %f用于扫描浮动,而不是双打。因此,如果你想要使用双精度变量,你必须使用scanf("%lf", &MilitaryTime);

最后,您在第一个if语句之前打开了一段代码。虽然我没有看到这会导致您当前的代码出现问题,但我没有理由这样做,除非您有特定的内容,我会删除它。

所以,你的固定代码将是:

/*Convert military time to standard time*/
#include <stdio.h>

int main (void)
{
double MilitaryTime, StandardTime;
printf("Enter a military time (0000 to 2359): \n");
scanf("%lf", &MilitaryTime);

if(MilitaryTime <= 2359)
    {
        if(MilitaryTime <= 1159)
        {
            StandardTime = MilitaryTime/100;
            printf("The regular time is: %2f AM\n", StandardTime);
        }

        else
        {
            StandardTime = (MilitaryTime - 1200)/100;
            printf("The regular time is: %2f PM\n", StandardTime);
        }

    }
        else
        {
            printf("Error: Please enter a number between 0000 and 2359: %f\n");
            scanf("%f", &MilitaryTime);
        }
}

最后一点:请记住,您只是检查输入是否小于或等于某个数字。你没有检查它确实是一个数字,或者它不是负数,这两个都是防止程序崩溃的良好行为。


0
投票

您收到此错误的原因是:

if(MilitaryTime <= 1159)
    StandardTime = MilitaryTime/100;
    printf("The regular time is: %2f AM\n", StandardTime);
else
...

请注意,C中的缩进没有意义(例如在Python中)。

你的代码相当于:

if(MilitaryTime <= 1159)
{
    StandardTime = MilitaryTime/100;
}
    printf("The regular time is: %2f AM\n", StandardTime);
else
...

正如你所看到的,printfif块之后,对于编译器是整个if块的末尾,然后它看到没有先前的elseif,这是语法错误。

正确的代码是:

if(MilitaryTime <= 1159)
{
    StandardTime = MilitaryTime/100;
    printf("The regular time is: %2f AM\n", StandardTime);
} else {
    StandardTime = (MilitaryTime - 1200)/100;
    printf("The regular time is: %2f PM\n", StandardTime);
}

编辑

请注意,在C中,ifwhile块的正确语法是

// very simplified version of the grammer

if(condition)
    statement-block;

while(condition)
    statement-block;

statement-block can be one of this:

 - ;

 - { statement1; statement2; ... }

 - statement

一般来说,在ifwhile之后你只能有一个陈述。如果你需要更多,那么你必须用花括号{ statement1; statement2; .. }包裹它们

有些情况下你只看到一个冒号;

// these are the same
if(condition);

if(condition)
{
}

请注意,代码的缩进与C无关。分号qazxsw poi是告诉语句appart的内容。这两个程序是等价的。

;
© www.soinside.com 2019 - 2024. All rights reserved.