Как добавить символ (ноль) в конце массива символов в C? - PullRequest
0 голосов
/ 06 февраля 2019

Я новичок в C (вместо этого я использую Delphi / паскаль) и пытаюсь получить некоторые значения датчика температуры и сделать их равными / фиксированным размером для отправки в MCU (с Arduino IDE - поэтому мне приходится работать с C).

Длина данных (strlen ()) может быть 3 (например, 5,3, 0,9, 0,0 и т. Д.), 4 (например, -4,2, 19,8 и т. Д.) Или 5 (например, -15,6) в зависимости от датчика температуры икод ниже;

    char value[5]; // must be char in order to send to MCU
    if ((temp_data>=temp_max){
      fix_size(value,true); //Error part. writes: "EEEEE" to reach fix size: 5
    } else {
      dtostrf(temp_data, 0, 1, value);
     fix_size(value,false); //I'll use this to send data to screen later..
    }

Мне нужно исправить размер данных (для этого я пытаюсь добавить нули в конце), а Iam пытается сделать ниже;

char fix_size(char temp_char[5],bool err=false){
  if(err){
    temp_char= "EEEEE";
    Serial.println(temp_char);
    return temp_char;
  }
  int num = strlen(temp_char);
  // If strlen is 5 then it is OK and strlen cannot be 2 and 1 because of my temp sensor data processing (dtostrf(temp_data, 0, 1, value)) so I only need to take care 3 and 4
  switch (num) {
    case 3:
      temp_char[3] = "0";
      temp_char[4] = "\0";
      //0.0 would become 0.000
      //5.4 would become 5.400
    break;
    case 4:
      temp_char[4] = "\0";
      //15.2 would become 15.20
      //-7.4 would become -7.40
    break;
      // -15.3 is in right format already
  }                              | E.g. I tried for 15.4 and get
  Serial.println(temp_char[0]);  | 1
  Serial.println(temp_char[1]);  | 5
  Serial.println(temp_char[2]);  | .
  Serial.println(temp_char[3]);  | 4
  Serial.println(temp_char[4]);  | ؟
  return temp_char;
}

Но, когда я запускаю приложение, я беру странные символы в качестве вывода в ArduinoIDE (обратные знаки вопроса, квадраты и т. Д.).В чем может быть проблема? Как я могу решить эту проблему?или можешь предложить лучший способ?спасибо прямо сейчас ..

ПРИМЕЧАНИЕ: Происхождение этого вопроса (проблемы) больше относится к встраиваемым системам, и я задал еще один вопрос по электронике StackExchage в качестве ссылки на этот вопрос (Если вы хотите / нужно Вы можете прочитать здесь )

1 Ответ

0 голосов
/ 06 февраля 2019

Как минимум три проблемы.Во-первых, temp_char[] объявлен с размером 5, но вы пытаетесь поместить в него 6 символов с помощью "EEEEE" (с конечным нулем) и с использованием temp_char[5] (допустимы только значения 0..4).

Во-вторых, присваивание temp_char = "EEEEE" просто меняет указатель, фактически ничего не копирует в temp_char.Вам нужно strcpy() или что-то подобное для этого.

В-третьих, вы путаете типы:

temp_char[4] = "0";

temp_char[4] относится к типу char."0" имеет тип char *, то есть это указатель на символ, а не символ, так что вы просто получаете младшие 8 бит некоторого произвольного адреса памяти.Вы, вероятно, имеете в виду:

temp_char[4] = '0';

, поскольку '0' имеет тип int, представляющий значение ASCII, которое будет надлежащим образом усечено до 8 бит при назначении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...