Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以尽可能少的分配连接lex中的字_C_Lex - Fatal编程技术网

C 以尽可能少的分配连接lex中的字

C 以尽可能少的分配连接lex中的字,c,lex,C,Lex,在源文件test.c的词法分析过程中,假设它是 … //布拉格马。。。一二… 我需要从这个评论中得到一些信息。如果yytext当前指向“一”,我想连接“一”和“二”。 我可以这样做以避免为p1分配内存吗 char* p1 = yytext; // yytext points to "one" yytext += strlen(yytext)+1; // yytext now points to "two" ... char* p = strcat(p1, yytext); // p shoul

在源文件test.c的词法分析过程中,假设它是


//布拉格马。。。一二…

我需要从这个评论中得到一些信息。如果yytext当前指向“一”,我想连接“一”和“二”。
我可以这样做以避免为
p1
分配内存吗

char* p1 = yytext; // yytext points to "one"
yytext += strlen(yytext)+1; // yytext now points to "two"
...
char* p = strcat(p1, yytext); // p should points to "onetwo"

这对我目前的测试很有效。但是我担心在yytext更改后,
p1
可能指向非法内存。

也许您正在寻找
yymore()
lex操作

在(f)lex操作中调用
yymore()。flex手册中有一些示例说明了一些用法


在(f)lex操作中,您可以自由修改由
yytext
指向的令牌字符串中的任何字节,但不得修改(且不得引用)包含该字符串的(f)lex缓冲区中的任何字节。这意味着您不应该修改令牌的NUL终止符,因为这样做的效果是将令牌扩展到缓冲区的“剩余”中,而缓冲区可能不存在。(在flex中,缓冲区恰好以两个NUL字节终止,因此缓冲区中有一个“剩余”字节,但其他lex实现并非如此,因此您可以通过覆盖NUL终止符来创建缓冲区溢出。)

跳过带有
yytext+=strlen(yytext)+1
的令牌几乎肯定是非法的。使用strcat直接进入前文本可能也会导致UB。不要写入lex提供的变量;分配你自己的。这是一个太少的信息给一个好的答案,但通常,你应该尝试配置你的lexer的方式,“一两个”将被扫描为一个令牌,而不是读取两个令牌并连接它们。你的情况不可能吗?我刷新了我的描述,请看一看。@Ctx@dasblinkenlight