Может кто-нибудь объяснить, почему мой последний оператор else не будет выполняться?

#c #if-statement #cs50 #argv #atoi

#c #if-statement #cs50 #argv #atoi

Вопрос:

Я пытаюсь преобразовать свою строку argv в целое число. Для некоторых я не могу запустить свой последний оператор else. Буду признателен за любую помощь. Я только начинаю с C. Вот мой код.

 #include <cs50.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


int main(int argc, string argv[])
{
    if (argc == 2)
    {
        for(int i = 0, n = strlen(argv[1]); i < n; i  )
        {
            if (!isdigit(argv[1][i])) {
            printf("Usage: ./caesar keyn");
            
            }
            
        }
    }
        else if (argc != 2)
        {
            printf("Usage: ./caesar keyn");
        }
        
        else if (argc == 2)
        {
            int x = atoi(argv[1]);
            printf("%i", x);
            return 0;
        }
}
  

Ответ №1:

Написанная с помощью фигурных скобок и отступов, ваша структура кода выглядит следующим образом:

 if ( argc == 2 )
{
     stuff
}
else
{
    if ( argc != 2 )
    {
         stuff
    }
    else if ( argc == 2 )
    {
         stuff
    }
}
  

Итак, как только первый тест завершается неудачей, выполнение переходит к после окончания блока, контролируемого соответствующим else .

Написанный вами код имеет ту же логику, только без необязательных фигурных скобок и разных пробелов.

Ответ №2:

Я не могу запустить свой последний оператор else.
… почему мой последний оператор else не будет выполняться?

При лучшем форматировании может быть легче увидеть, что код тестируется (argc == 2) дважды в одном и том же if, else if, else if дереве.

 int main(int argc, string argv[]) {
  if (argc == 2) {
    for (int i = 0, n = strlen(argv[1]); i < n; i  ) {
      if (!isdigit(argv[1][i])) {
        printf("Usage: ./caesar keyn");

      }

    }
  } else if (argc != 2) {
    printf("Usage: ./caesar keyn");
  } else if (argc == 2) {  // cannot be true given prior `if (argc == 2)`
    int x = atoi(argv[1]);
    printf("%i", x);
    return 0;
  }
}