Непонимание значения int (* convert) (int c) = NULL; Что делает это утверждение? Правильный вывод не найден - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь решить проблему, когда нам нужно написать программу, которая преобразует верхний регистр в нижний регистр или нижний регистр в верхний, в зависимости от имени, с которым он вызывается, как показано в argv [0]. Я нашел эту программу в inte rnet, и я не понимаю, что это утверждение int (* convert) (int c) = NULL; пытается сделать. Я пытаюсь запустить эту программу на терминале, но она всегда идет к оператору else, выводит эти четыре строки и завершается. Так как argv [0] всегда ./a.out. Итак, как мне получить правильный вывод из этой программы?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define SUCCESS           0
#define NO_ARGV0          1
#define BAD_NAME          2


int main(int argc, char *argv[])
{
  int ErrorStatus = SUCCESS;
  int (*convert)(int c) = NULL;
  int c = 0;

  /* check that there were any arguments */
  if(SUCCESS == ErrorStatus)
  {
    if(0 >= argc)
    {
      printf("Your environment has not provided a single argument for the program name.\n");
      ErrorStatus = NO_ARGV0;
    }
  }

  /* check for valid names in the argv[0] string */
  if(SUCCESS == ErrorStatus)
  {
    if(0 == strcmp(argv[0], "lower"))
    {
      convert = tolower;
    } 
    else if(0 == strcmp(argv[0], "upper"))
    {
      convert = toupper;
    }
    else
    {
      printf("This program performs two functions.\n");
      printf("If the executable is named lower then it converts all the input on stdin to lowercase.\n");
      printf("If the executable is named upper then it converts all the input on stdin to uppercase.\n");
      printf("As you have named it %s it prints this message.\n", argv[0]);
      ErrorStatus = BAD_NAME;
    }
  }

  /* ok so far, keep looping until EOF is encountered */
  if(SUCCESS == ErrorStatus)
  {
    while(EOF != (c = getchar()))
    {
      putchar((*convert)(c));
    }
  }

  /* and return what happened */
  return SUCCESS == ErrorStatus ? EXIT_SUCCESS : EXIT_FAILURE;
}


...