О некоторых настройках strtok()

Это предупреждение, которое я получаю:

passing argument 1 of ‘strtok’ discards ‘const’ qualifier from pointer target 
type [enabled by default]

Я хотел отключить эту операцию по умолчанию, может ли кто-нибудь помочь мне с этим?

Спасибо!


person Kyoichi Shido    schedule 10.09.2017    source источник
comment
Было бы полезно, если бы вы показали нам код, который вызывает ошибку с некоторым контекстом. Проверьте Как спросить   -  person myaut    schedule 10.09.2017


Ответы (1)


strtok работает на месте: ему нужно маркировать строку, которую вы ему передали.

Конечно, вы можете принудительно применить неконстантное приведение, но это нарушит контракт. Что, если вызывающая сторона ожидает повторного использования переданной строки после вашей операции? Так что это беспроигрышный вариант.

Поэтому, если у вас есть какая-то постоянная строка, вы должны сделать копию перед ее использованием, например, используя strdup

char *copy = strdup(my_const_char);
toks = strtok(copy," ",NULL);
...

В конце концов, у вас есть все ваши токены в отдельных указателях, а память уже выделена и удерживается copy. Если вам больше не нужны токены, freeing copy — это все, что вам нужно, чтобы очистить их.

Обратите внимание, что общий ответ на этот вопрос квалификатора const: 1 отбрасывает квалификаторы из целевого типа указателя

person Jean-François Fabre    schedule 10.09.2017