为什么不在打印中使用 msg 而不是 msg[pointer -1]?

Why don't use msg in printing instead of msg[pointer -1]?

打印正确,但我感到困惑的是,每当我只写 msg,它就会给我 Your ?@ 以及每当我写msg[option-1],它给了我 你的名字是 bilal 的完整信息。我不理解 [option-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;
}

转换说明符%s是为输出字符串而设计的。它需要 char * 类型的参数。

数组msg声明为

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

即其元素的类型为 char *。表达式中使用的数组本身具有 char ** 类型。因此它可以提供给转换说明符 %s.

访问数组元素的索引的有效范围是 [ 0, sizeod( msg ) / sizeof( char * ) ),而在下面显示的循环中,索引变量从 [1, sizeof( msg ) / sizeod( char * ) + 1 ).

更改

就是在这个循环中

  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]);

即输出从数组中选择的字符串