【问题标题】:Printing elements of an Array in C在 C 中打印数组的元素
【发布时间】:2016-06-24 00:20:04
【问题描述】:

嗯,这是一个基本程序,我得到了一个字符数组,比如:

char alphabet[5] = {'A', 'B2', 'C', 'D4', 'E'};

我想在 for 循环中打印该数组的元素:

int remainder = my_number % 5; printf("%c\n", alphabet[remainder]);

那就是我无法让它按预期运行的地方打印出来了 A2C4E。我怎样才能让它打印B2D4

我听说过使用枚举,但我不明白如何使用,我对元素具有价值的想法以及如何使用它们的价值获取元素感到困惑,例如:enum letters {'a', 'b', 'c'}; a = 0, b = 1 和 c = 2。

(也许只是我的语法不正确,但如果你能帮助我,请...)

我将打开我的代码以便于解释。

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

const char *notes[13] = {"C", "C2", "D", "D2", "E", "F", "F2", "G", "G2", "A", "A2", "B", "c"}; // The 2's is for the "#"

int main(int argc, char const *argv[]) // Just using argv[1] to say how much numbers I want to print 
{
  int now, before_1 = 1, before_2 = 1, rem, steps; // "rem" stands for remainder
  char note;

  if (atoi(argv[1]) <= 2)
    for (steps = 0; steps < atoi(argv[1]); steps++)
      printf("1\n");
  else
    for (steps = 0; steps < atoi(argv[1]); steps++) // Main loop for Fibonacci's Numbers
    {
      now = before_1 + before_2;
      rem = now % 13;
      note = notes[rem];
      printf("Note : %c <=> Rem : %d. Num : %d\n", note, rem, now);

      before_2 = before_1; // Change values of variables
      before_1 = now;
    }

  return 0;
}

这个想法是获取斐波那契系列的数字并将它们转换为所有可能的 13 个音符(包括尖锐的音符),但正如我所说的,输出的音符太好了。

【问题讨论】:

  • B2D4 不是字符。
  • 它们是字符串吗?
  • @tkausl:它们是有效的字符常量。只是作为 char 对象的初始化器可能不正确。
  • 但在这种情况下,它应该只打印B D,因为它们确实是字符,对吧? @tkausl @Olaf
  • 不清楚你想要什么。 1)字母通常是单个字母,那么您希望在某些条目中包含两个字符的原因是什么? 2)enumss 是非常不同的东西。 3) char 通常采用 one 字符。它绝对不是“字符串”。 4)如果您想要一个“字符串”,请使用 C 字符串。 5) C 没有字符串type。这是关于如何使用char 数组的所有约定。 6) 数组与指针不同! 7) 所有这些都将在任何优秀的 C 书籍中进行解释。

标签: c arrays enums


【解决方案1】:

在这个问题的原始版本中,问题是双重的。

首先,字母被定义为一个字符数组,即char alphabet[]。根据最初的问题,它应该被声明为一个字符串数组,即char *alphabet[]

其次,在某种程度上从第一个问题开始,初始化值是字符,而它们应该被定义为字符串。 F2 定义为字符,因此'F2',将不代表文字字符串“F2”

char *alphabet[] = {"A", "B2", "C", "D4", "E"};

最后,为了打印字符串而不是字符,printf 格式标识符必须从 %c 更改为 %s

总结一下,可以如下打印字符串数组的元素:

char *alphabet[5] = {"A", "B2", "C", "D4", "E"};
for(int i = 0; i < 5; i++){
    printf("%s} ", alphabet[i]);
}

如果一开始就不知道数组的大小,也可以这样写:

char *alphabet[] = {"A", "B2", "C", "D4", "E"};
for(int i = 0; i < sizeof(alphabet)/sizeof(alphabet[0]); i++){
    printf("%s ", alphabet[i]);
}

希望对你有帮助!

【讨论】:

  • 您应该详细说明什么是 OP 故障。然而,显然 OP 彻底改变了游戏规则。
  • 嗯,你添加了一些解释,很好。一些补充/更正:字符常量(例如'a')的类型为int,而不是char。 C 没有其他语言意义上的字符类型。 char 首先是一个整数。另请注意 OP 更改了问题,也许您想添加 _actual_ 代码的问题(后期更改是非常糟糕的风格)。这就是为什么你也应该要求minimal reproducible example,这样的 sn-ps 通常缺乏相关的上下文和/或不是正在编译的代码。
  • 是的,我同意你的看法。但是,我没有解决编码风格,因为我想坚持这个问题。他并不是要求进行风格审查,也许这会将主要焦点转向实现斐波那契数列变体的不同方法。
  • 这不是关于编码风格,而是关于How to Ask。也许态度是一个更好的术语(对不起,ESL)。答案应该是完整的,并且还应涵盖未明确要求的方面(如果它们是显而易见的)。仅与问题相关的视觉样式(例如缺少大括号)
【解决方案2】:

char 用于单个字符。如果你想要多个字符,你需要使用字符串。

char *strings[] = { "A", "B2", "C", "D4", "E"};

int remainder = my_number % 5;
printf("%s\n", strings[remainder]);

【讨论】:

    【解决方案3】:

    正如 odin19 所指出的,B2 和 D4 不是 C 中的字符。为了打印它们,您可以在数组元素中使用双引号,并在 printf 中使用 %s 将它们打印为字符串。

    【讨论】:

      【解决方案4】:

      单引号用于表示字符。所以'B2' 将被视为一个字符。相反,您需要char*,因此需要双引号。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多