Как уже отмечали другие, проблема в том, что a
указывает на строковый литерал .strtok
изменяет свой ввод (он перезаписывает разделители строковым терминатором), и при попытке изменить строковый литерал поведение undefined - вы можете получить ошибку во время выполнения, код может работать как ожидалось, иличто-то еще может случиться.Строковые литералы предполагаются неизменяемыми, но не гарантируется, что они будут храниться в постоянной памяти.
Есть несколько способов решить эту проблему.Один - объявить a
как массив и инициализировать его строкой:
char a[] = "xgdgsf: duh d";
Другой - динамически выделить буфер и скопировать в него содержимое строки:
char *a = malloc( strlen( "xgdgsf: duh d" ) + 1 );
if ( a )
strcpy( a, "xgdgsf: duh d" );
Если она доступна в вашей системе, вы можете использовать нестандартную функцию strdup
, чтобы сделать то же самое:
char *a = strdup( "xgdgsf: duh d" );
При объявлении указателя на строковый литерал обычно хорошей идеей являетсяквалифицируйте его как const
:
const char *a = "xgdgsf: duh d";
, таким образом компилятор будет вам мешать, если вы попытаетесь изменить (назначить) *a
или a[i]
или передать его функции, ожидающей простогоchar *
в качестве ввода.Таким образом, ошибки, такие как использование strtok
для литерала, обнаруживаются во время компиляции, а не во время выполнения.