我正在使用C编写一个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已停止工作。)
有人可以帮我这个吗?
答案 0 :(得分:2)
首先,将符号表放入文件是一个非常有争议的设计选择:
如果将所有符号信息存储到文件中,则每次要访问给定符号时,都必须重新读取整个文件并将每个信息位转换为存储器表示。
这不仅效率低下,而且还会迫使您编写大量不必要且复杂的代码。
search
功能。无论当前的错误如何,您的功能都是而不是搜索,但您需要搜索文件才能使其正常工作。
您的功能是创建yytext
值的唯一列表。您在其中执行的“搜索”只是确保已存在的值不会重复。
要做的第一件事就是给它一个不那么具误导性的名字,或者修改它以使其符合它的名字所暗示的。
如果由于某种原因你还想使用文件,我想你会把每个名字都放在一行上
那么为什么不使用fgets()
来处理行结尾?
无论您使用什么方法来读取每个名称,都必须为字符串提供一个具有实际存储空间的缓冲区,而不仅仅是一个单位指针。
如果您的输入字符串为yytext
,则永远不会使用您的x
参数。
最后,您的search
函数(将当前的yytext值插入未排序的列表中)没有理由返回任何内容(如果磁盘已满,则无法添加新名称除了错误代码清单)。