【问题标题】:Why don't use msg in printing instead of msg[pointer -1]?为什么不在打印中使用 msg 而不是 msg[pointer -1]?
【发布时间】:2020-09-16 22:00:49
【问题描述】:

打印正确,但我感到困惑的是,每当我只写 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 是一个字符串数组,它的类型是const char * const[8]。为什么您希望能够将数组msg 用于%s 格式?
  • 发布的代码正确。弗拉德解释了原因。
  • 使用for(option=1;option&lt;=sizeof(msg)/sizeof(char *);++option)而不是for(option=0;option&lt;=sizeof(msg)/sizeof(char *)-1;++option)的有争议的使用方式,这里的表达式显然是在编译时计算的常数值,并在循环中引入术语option-1最终可以不要在不太聪明的编译器上进行优化。

标签: c function printf c-strings conversion-specifier


【解决方案1】:

转换说明符%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]);

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

【讨论】:

  • 我还是没看懂[option-1]
  • @natashaBibi 数组msg的第一个元素的索引为0。清楚吗?如果用作索引的变量选项从 1 开始,如何输出此元素?或者如果变量选项等于数组的大小,如何输出数组的最后一个元素?我向你展示了一系列的 iondices。
  • 所以在我的理解中是这样工作的 [option-1] == [8-1] 然后 [7-1] 并且重复直到它到达第一个。表示它正在反转。
  • @natashaBibi 你的数组有 8 个元素。访问元素的有效索引为 0-7(含)。变量选项从等于 1 的初始值开始,最多更改为 8。因此,要输出索引为 0 的数组的第一个元素或最后一个元素,您必须编写 msg[oprion-1]。
  • 我理解了第一个元素,但是索引为零的数组的最后一个元素是什么意思。是反面吗?
猜你喜欢
  • 2010-11-15
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2013-08-06
  • 2011-07-10
  • 2019-08-02
相关资源
最近更新 更多