Вы не можете вызвать strtok()
для строкового литерала, потому что строковые литералы являются постоянными. Обычно безопаснее объявлять указатели на строковые литералы с квалификатором const
, чтобы компилятор предупредил вас, когда программа пытается изменить указатель.
Вам нужно сделать вашу строку массивом вместо указателя на строковый литерал, например
static char __rx_data[] = "AT+CGMI\r";
это массив из 9
байтов, содержащий строку из 8
символов, которые вы можете изменять, strtok()
действительно изменяет его аргументы.
Вам также необходимо выделить место для вашего struct
, чтобы его можно было использовать, вы можете сделать это двумя способами, используя malloc()
AT_msg_Data *data;
data = malloc(sizeof(*data));
if (data == NULL)
return -1; /* failed to allocate memory -- exit the program */
или просто создайте экземпляр в стеке
AT_msg_Data data;
/* ^ no star here */
а затем получить доступ к его членам с .
вместо ->
.
Другой способ, который неприменим в этом случае, поскольку ваша строка не может быть выделена динамически, - это использовать malloc()
или strdup()
.
Вы также можете использовать strchr()
вот так
const char *plus;
plus = strchr(__rx_data, '+');
if (plus != NULL)
{
size_t length; /* maybe use `ptrdiff_t' here but just for illustration */
length = plus - __rx_data;
data->header = malloc(length + 1);
if (data->header != NULL)
{
memcpy(data->header, __rx_data, length);
data->header[length] = '\0';
data->body = strdup(plus + 1);
}
/* note: data->header can be `NULL' from here, so check that before using it */
/* this also applies to data->body */
}
Таким образом, вам не нужно будет изменять __rx_data
, что лучше, потому что это глобальная переменная, и я предполагаю, что вы собираетесь использовать ее повторно. Вы должны сделать свой код более безопасным, повторно объявив
static const char *const __rx_data = "AT+CGMI\r";
если вы собираетесь использовать подход strchr()
.
С этим объявлением __rx_data
нельзя переназначить или изменить без жалоб компилятора.
Ваш код в любом случае потерпит неудачу позже, потому что '\0'
, помещенный strtok()
в позицию знака +
, будет перезаписан +
, когда вы снова вызовете strtok()
, strtok()
сохраняет внутренний буфер для восстановления замененных символов, что также делает его небезопасным, если ваша программа многопоточный.
person
Iharob Al Asimi
schedule
29.09.2015
static char *__rx_data = "AT+CGMI\r";
- ›static char __rx_data[] = "AT+CGMI\r";
- person Spikatrix   schedule 29.09.2015