1

它打印正确,但我很困惑,每当我只写msg时,它都会给我Your ?@并且每当我写 msg[option-1] 时,它都会给我完整的信息Your name is 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;
}
4

1 回答 1

0

转换说明符%s旨在输出字符串。它需要一个类型为 的参数char *

数组msg声明为

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

那就是它的元素有类型char *。表达式中使用的数组本身具有类型char **。所以它可以提供给转换说明符%s

访问数组元素的有效索引范围是[ 0, sizeod( msg ) / sizeof( char * ) )while 在下面显示的循环中,索引变量从 更改[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]);

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

于 2020-05-29T10:57:19.457 回答