заставляют вас обслуживать это в вашем Mainifest
<service
android:name=".sys.service.youservice"
android:exported="true"
android:process=":ServiceProcess" />
, тогда ваша служба будет работать в другом процессе с именем ServiceProcess
, если вы хотите, чтобы ваша служба никогда не умирала:
strtok
плохой гражданин.
Во-первых, он сохраняет состояние, которое вы неявно использовали при вызове strtok(NULL,...)
- это состояние сохраняется в частной памяти библиотеки Standard C, что означает, что только однопоточные программы могут использовать strtok
. Обратите внимание, что в некоторых библиотеках существует реентерабельная версия под названием strtok_r
.
Для другого и для ответа на ваш вопрос, strtok
изменяет свой ввод. Он не выделяет место для строк; он записывает NUL-символы вместо разделителя во входной строке и возвращает указатель на входную строку.
Вы правы, что strtok
может вернуть более 10 результатов. Вы должны проверить это в своем коде, чтобы не писать после конца tokens
. Надежная программа либо установит верхний предел, такой как ваш 10
, и проверит его, сообщит об ошибке, если она превышена, либо динамически выделит массив tokens
с помощью malloc
, и realloc
, если получит слишком много. большой. Тогда ошибка возникает, когда вам не хватает памяти.
Обратите внимание, что вы также можете обойти проблему strtok
изменения входной строки с помощью strdup
, перед ее передачей в strtok
. Затем вам нужно будет освободить новую строку после того, как она и tokens
, которые указывают на нее, выйдут из области видимости.
tokens
это массив указателей.
Различие между строками и указателями, если часто нечеткое. В некоторых ситуациях строки лучше продумывать как массивы, в других - как указатели.
В любом случае ... в вашем примере input
- это массив, а tokens
- это массив указателей на место в пределах input
.
Данные внутри input
меняются при каждом вызове на strtok()
Итак, шаг за шагом
// input[] = "foo bar baz";
tokens[0] = strtok(input, " ");
// input[] = "foo\0bar baz";
// ^-- tokens[0] points here
tokens[1] = strtok(NULL, " ");
// input[] = "foo\0bar\0baz";
// ^-- tokens[1] points here
tokens[2] = strtok(NULL, " ");
// input[] = "foo\0bar\0baz";
// ^-- tokens[2] points here
// next strtok returns NULL