yytext
указывает на временную структуру данных, внутреннюю для лексера, чье время жизни ограничено действием лексера. (Точнее, его время жизни начинается с действия лексера и заканчивается непосредственно перед лексическим сканированием.)
Другими словами, вы не можете сохранить значение yytext
в качестве указателя. Вы должны скопировать содержимое строки, на которую указывает yytext
, если хотите сохранить строку для дальнейшего использования. Если у вас есть strdup
, вы можете использовать его для создания копии строки (но не забудьте free()
копию, когда она вам больше не нужна.) Если у вас нет strdup
, или для по какой бы причине он не хотел использоваться, вы можете динамически распределять пространство самостоятельно:
char* theToken = malloc(yyleng + 1); strcpy(theToken, yytext);
Стоит также упомянуть, что, учитывая, что for_body
указывает на неизменную строку длины 0 (char * for_body = "";
), Попытка добавить к нему текст является неопределенным поведением:
strcat(for_body,yytext);
На многих платформах этот вызов приведет к сбою, поскольку при инициализации for_body
он указывает на доступную только для чтения память. Но если память доступна для записи, она не является частью массива, на который указывает for_body
, что означает, что она является частью некоторого другого объекта, значение которого будет уничтожено при вызове strcat
.