Почему бы не использовать при печати msg вместо msg [указатель -1]? - PullRequest
1 голос
/ 29 мая 2020

Он печатается правильно, но я не понимаю, что всякий раз, когда я пишу просто msg , он дает мне Your? @ и всякий раз, когда я пишу msg [option-1], он дает мне полное сообщение Ваше имя bilal . Я не понимаю причину [вариант-1]. Для чего он используется и в чем его функция?

#include <stdio.h>    
#define MAX_LEN 256

int main(){
  FILE * fp = fopen("file.txt","r");
  int option;
  char word[MAX_LEN];
  static const char * const msg[] = {
    "Name",
    "Date of Birth",
    "ID Card Number",
    "Phone Number",
    "Address",
    "Account", 
    "Fixing Year",
    "Amount" };
      for (option = 1; option <= sizeof(msg)/sizeof(char *); ++option)
      printf("%d. Your %s:\n", option, msg[option-1]);
  fclose(fp);
  return 0;
}

1 Ответ

0 голосов
/ 29 мая 2020

Спецификатор преобразования %s предназначен для вывода строк. Ожидается аргумент типа char *.

Массив msg объявлен как

static const char * const msg[] = {
//...

, то есть его элементы имеют тип char *. Сам массив, используемый в выражениях, имеет тип char **. Таким образом, он может быть передан в спецификатор преобразования %s.

Допустимый диапазон индексов для доступа к элементам массива - [ 0, sizeod( msg ) / sizeof( char * ) ), в то время как в l oop, показанном ниже, индексная переменная изменяется с [1, sizeof( msg ) / sizeod( char * ) + 1 ).

То есть в этом l oop

  for (option = 1; option <= sizeof(msg)/sizeof(char *); ++option)

индексы начинаются с 1. Итак, чтобы правильно вывести элемент массива, вы должны использовать выражение option - 1 как индекс и выражение msg [option-1] имеют требуемый тип char *, который ожидается спецификатором преобразования при вызове prontf.

  printf("%d. Your %s:\n", option, msg[option-1]);

То есть выводится строка, выбранная из массива .

...