gpt4 book ai didi

c - Flex - 在 C 中比较字符串的函数

转载 作者:太空宇宙 更新时间:2023-11-04 02:44:34 25 4
gpt4 key购买 nike

我正在使用 C 和 flex 进行编程,这是一个 C 代码编译器,我想比较文件中的字符串,在本例中是我的符号表,与 yytext。如果 yytext 和表中的相应字符串相同,则应退出函数,如果表中没有实例,则函数会将字符串写到符号表中。

这是我的功能:

search (char *x){
int c;
int n = 0;
char *cdn;
while ((c = fgetc(comp)) != EOF){
fscanf(comp, "%s", cdn);
if (strcmp(cdn, yytext) == 0){
n++; //if n>0 when it finishes searching the file then there's a copy on the file
}else{}
return 0;
}
if (n==0){
fprintf(comp, "%d\t %s\n", pos++, yytext); //will write if there's no copy in the table
}else return 0;}

该函数的输入是 yytext,yytext 将有例如“a”。

运行后,程序什么都不写,需要手动关闭。 (更像是 program.extension 已停止工作。)

有人可以帮我解决这个问题吗?

最佳答案

首先,将符号表放入文件是一个非常值得商榷的设计选择:

  • 符号的检查非常频繁,因此文件访问会大大降低编译器的速度。
  • 符号将与许多语法信息相关联(例如,它们可能表示具有关联类型的变量),因此仅存储名称不足以让编译器的后续阶段工作。

如果将所有符号信息存储到文件中,则每次要访问给定符号时都必须重新读取整个文件并将每一位信息转换为内存表示。
这不仅效率低下,还会迫使您编写大量不必要且复杂的代码。

现在为您的搜索功能。

不管当前的错误如何,您的函数所做的不是搜索,尽管您需要搜索文件才能使其工作。

您的函数所做的是创建一个唯一的 yytext 值列表。您在其中执行的“搜索”只是确保不重复已经存在的值。

首先要做的是给它起一个不那么容易误导的名称,或者修改它,使其发挥其名称所暗示的作用。

现在是错误

如果出于某种原因您仍想使用文件,我想您会将每个名称放在一行中。
那么为什么不使用 fgets(),它会为您处理行尾呢?

无论您使用什么方法来读取每个名称,您都必须为字符串提供一个具有实际存储空间的缓冲区,而不仅仅是一个未初始化的指针。

如果您的输入字符串是 yytext,您的 x 参数将永远不会被使用。

最后,您的 search 函数(将当前的 yytext 值插入到一个未排序的列表中)没有理由返回任何内容(除了错误代码,如果您的磁盘已满并且您无法添加列表中的新名称)。

关于c - Flex - 在 C 中比较字符串的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28666443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com