Как удалить часть строки, а остальное разделить по первой "," - C (СИ)

Узнай цену своей работы

Формулировка задачи:

День добрый! Подскажите как мне сделать такое: 1) Дано буфер в который принимаются данные с UART
char uart2_rx_buf[128];
Данные приходят в следующем формате:

+CCLK: "15/11/20,13:42:53+08"\r\n0\r\n

Мне из этой строки необходимо оставить только

15/11/20,13:42:53

А потом данные поместь в 2 переменные типа char, разделив их по запятой. те должно получится в итоге char date должно присвоиться 15/11/20 и завершающий нулевой символ char time присвоиться 13:42:53 и завершающий нулевой символ Длина строки всегда одинакова. Потому положение знаков всегда одинаково. Спасибо.
По началу думал сделать так:
char uart2_rx_buf[128];
char date[40];
int main(void)
{
while(1)
{
strncpy(date, &uart2_rx_buf[8], 8);
}
}
но оно странно работает, выводит 15/11/20, а дальше мусор. Я так понимаю нет нулевого символа?

Решение задачи: «Как удалить часть строки, а остальное разделить по первой ","»

textual
Листинг программы
char uart2_rx_buf[128]
char date_buf[9];
char time_buf[9];
char *end_str = strstr(uart2_rx_buf, ",");
date_buf_len = end_str - uart2_rx_buf;
time_buf_len = strlen(uart2_rx_buf) - date_buf_len - 1;
strncpy(date_buf, &uart2_rx_buf[8], date_buf_len - 8);
date_buf[date_buf_len - 8] = '\0';
strncpy(time_buf, &end_str[1], time_buf_len - 8);

Объяснение кода листинга программы

  1. Объявлены три переменные: uart2_rx_buf (буфер приходящих данных), date_buf (буфер для даты) и time_buf (буфер для времени).
  2. Переменная end_str инициализируется функцией strstr, которая ищет первое вхождение подстроки , в uart2_rx_buf.
  3. Переменная date_buf_len вычисляется как расстояние от начала строки до первого вхождения ,.
  4. Переменная time_buf_len вычисляется как разница между длиной строки и длиной даты, уменьшенной на один, чтобы исключить , из времени.
  5. Строка date_buf копируется из uart2_rx_buf с 8-го символа (чтобы исключить , из даты) с помощью функции strncpy. Длина копируемой строки уменьшается на 8, чтобы исключить , из даты.
  6. В date_buf добавляется нулевой символ, чтобы завершить строку.
  7. Строка time_buf копируется из uart2_rx_buf после первого вхождения , (чтобы исключить , из времени) с помощью функции strncpy. Длина копируемой строки уменьшается на 8, чтобы исключить , из времени.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5
Похожие ответы