我正在尝试用c语言制作SIC汇编器,制作了一个小测试程序来搜索“START”关键字并从汇编代码文件中获取起始地址。然后将它们作为第一遍写入另一个文件中。代码不起作用。介意告诉我有什么问题吗?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
FILE *source;
FILE *intermediate;
rewind(source);
char word[10];
unsigned int address = 0;
char start[5] = "START";
source = fopen(argv[1],"r");
intermediate = fopen(argv[2],"r+");
while(strcmp(word,start) != 0)
{
fscanf(source, "%s", word);
}
fscanf(source, "%x", address);
fprintf(intermediate, "%x", address);
fprintf(intermediate, "%s", word);
return(0);
}
这是程序集输入:
COPY START 1000
FIRST STL RETADR
CLOOP JSUB RDREC
LDA LENGTH
COMP ZERO
JEQ ENDFIL
JSUB WRREC
J CLOOP
ENDFIL LDA EOF
STA BUFFER
LDA THREE
STA LENGTH
JSUB WRREC
LDL RETADR
RSUB
EOF BYTE C'EOF'
THREE WORD 3
ZERO WORD 0
RETADR RESW 1
LENGTH RESW 1
BUFFER RESB 4096
最佳答案
正如我和其他人在评论中指出的那样,您有几个错误。
1)使用未初始化变量(字)
2) 文件未打开时快退
3) 数组对于字符串来说太短(开始)
4) fscanf 的参数错误(地址而不是 &address)
此外还有其他问题,例如:
1) fscanf 中缓冲区溢出的风险
2)缺少对 EOF 的处理
3)缺少文件关闭
修复上述问题后,代码可能如下所示:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
FILE *source;
FILE *intermediate;
char word[10];
unsigned int address = 0;
const char start[] = "START";
source = fopen(argv[1],"r"); // Missing check of argc and successful file open
intermediate = fopen(argv[2],"w"); // Missing check of argc and successful file open
do
{
if (fscanf(source, "%9s", word) != 1)
{
printf("Illegal source file. START not found\n");
fclose(source);
fclose(intermediate);
exit(1);
}
} while(strcmp(word, start) != 0);
fscanf(source, "%x", &address); // Missing check of return value being 1
fprintf(intermediate, "%x", address);
fprintf(intermediate, "%s", word);
fclose(source);
fclose(intermediate);
return(0);
}
最后请注意,代码仍然错过了重要的检查,例如扫描地址时提供的参数数量、成功的文件打开以及 fscan
的返回值。
关于c - 如何实现在一个文件中查找单词然后写入另一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49401199/