Ошибка с конкатенацией символов strcat

Все еще не понимаю, что такое конкатенация символов.

void setup() {

  testCounter(3);

}

void loop() {
  // put your main code here, to run repeatedly:
}

char testCounter(int countx){
  char a[10];
  strcpy(a, "COUNTER: ");
  strcat(a, printDigits(countx));
  return a;
}

char printDigits(int digits){
  char a[3];
  if(digits < 10) {
    strcpy(a, "0");
    sprintf(a,"%d",digits);
  } else {
    sprintf(a,"%d",digits);
  }
  return a;
}

Ошибка: недопустимое преобразование из 'char' в 'const char' [-fpermissive]* в строке testCounter:

strcat(a, printDigits(countx));

Не понимаю эту часть ошибки.

Функция

printDigits возвращает символ, так что... strcat должен работать. Но почему все-таки ошибка?

Пожалуйста, помогите...

, 👍0


1 ответ


2
char printDigits(int digits){

Вы сообщаете компилятору, что вернете один символ.

 char a[3];

a — три символа. Таким образом, объявление не соответствует.


Вы можете изменить объявление на:

char * printDigits(int digits){

Но даже это было бы плохо, потому что a выйдет из области видимости после возврата функции.


 char a[3];

Это слишком мало для ввода целого числа. Целое число может состоять из 5 символов, плюс, возможно, знак минус, и в конце вам нужен нулевой знак. Семь байтов было бы безопаснее.


Самый простой способ сделать то, что вы хотите:

void setup() {
  Serial.begin (115200);
  testCounter(3);
}

void loop() {
}

char testCounter(int countx){
  char a[15];
  sprintf (a, "COUNTER: %02d", countx);
  Serial.println (a);
}

Также здесь:

< pre class="lang-c++ Prettyprint-override"> if(digits < 10) { strcpy(а, "0"); sprintf(a,"%d",цифры); } еще {

Это не сработает, потому что вы помещаете «0» в a, а затем перезаписываете его с помощью sprintf.


Функция

printDigits возвращает char, так что... strcat должен работать. Но почему все-таки ошибка?

Посмотрите на прототип strcat:

http://www.cplusplus.com/reference/cstring/strcat/

Он ожидает char *, а не char. Это разные вещи. Один из них является указателем, другой – нет.

,