Char substring, not String substring

when you define an array you give the number of elements so 6 elements, going from index 0 to index 5

char MAC_Parts[6][3];
the 3 means you can have 2 significant characters, the third one will be the trailing null char added by strlcpy()


for your code note that you could just iterate through the String using String functions to extract the pieces

something like this, typed here so let you test it.

String mac = "EC:FA:BC:9F:21:EB";

void setup() {
  Serial.begin(115200);
  Serial.print("ESP Now MAC Address    {");
  int pos = 0, colonPos = 0;

  while ((colonPos = mac.indexOf(':', pos)) >= 0) {
    if (pos != 0) Serial.print(", ");
    Serial.print("0x");
    Serial.print(mac.substring(pos, colonPos));
    pos = colonPos + 1;
  }

  if (mac.charAt(pos) != '\0') { // handle the last one which does not have a colon afterwards
    if (pos != 0) Serial.print(", ");
    Serial.print("0x");
    Serial.print(mac.substring(pos));
  }
  Serial.print("}");
}

void loop() {}

or you could go and print until you find a column or a null char and build the text as you go.

String mac = "EC:FA:BC:9F:21:EB";

void setup() {
  Serial.begin(115200);
  Serial.print("ESP Now MAC Address    {");

  int pos = 0;
  bool done = false;
  while (not done) {
    switch (mac.charAt(pos)) {
      case '\0': Serial.println("}");  done = true; break;
      case ':' : Serial.print(", 0x"); break;
      default  : if (pos == 0) Serial.print("0x"); Serial.write(mac.charAt(pos)); break;
    }
    pos++;
  }
}

void loop() {}

plenty of options