我正在为系统软件中的程序块编写程序。我将汇编程序的每一行存储到一个数组中。后来我将它们分成了令牌并将它们存放到一个结构中。但我不知道为什么最后intfile.oper[0]
被intfile.oper[m]
取代
以下是代码:
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<stdlib.h>
#include<sys/stat.h>
struct intermediate_file
{
char line[50][50];
char filename[20];
char instr[20][10];
char label[20][10];
char oper[30][10];
}intfile;
char buffer[2000]=" ";
char statement[50][50]; /*to store each line of the input program*/
int i=0;/* to count no of lines*/
void read_into_buffer()
{
int fd;
fd=open("input.txt",O_RDONLY);
const ssize_t r=read(fd,buffer,500);
buffer[r]='\0';
printf("\nTHE FILE CONTENTS ARE:\n%s",buffer);
}
void into_statements()
{
char *tok;
int j;
tok=strtok(buffer,"\n");
while(tok !=NULL)
{
strcpy(intfile.line[i],tok);
strcpy(statement[i],tok);
i++;
tok=strtok(NULL,"\n");
}
}
void seperation()
{
int m,count;
char *tok;
/*extracting first statement into the structure*/
sscanf(statement[0],"%s %s %s",intfile.filename,intfile.instr[0],intfile.oper[0]);
for(m=1;m<i;m++)
{
printf("\nm:%d",m);
/*counting the no of tokens in each line*/
count=0;
tok=strtok(statement[m]," ");
while(tok!=NULL)
{
count++;
tok=strtok(NULL," ");
}
/*extracting into the structure*/
if(count==3)
{
sscanf(intfile.line[m],"%s %s %s",intfile.label[m],intfile.instr[m],intfile.oper[m]);
printf("\n%s",intfile.oper[0]);
}
else//if count==2
{
sscanf(intfile.line[m],"%s %s",intfile.instr[m],intfile.oper[m]);
printf("\n%s",intfile.oper[0]);
}
}
}
int main()
{
read_into_buffer();
into_statements();
seperation();
}
input.txt包含:
COPY START 0000
FIRST STL RETADR
CLOOP JSUB RDREC
LDA LENGTH
COMP #0
JEQ ENDFIL
JSUB WRREC
J CLOOP
ENDFIL LDA =C'EOF'
STA BUFFER
LDA #3
STA LENGTH
JSUB WRREC
J @RETADR
USE CDATA
RETADR RESW 1
LENGTH RESW 1
USE CBLKS
BUFFER RESB 4096
BUFEND EQU *
MAXLEN EQU BUFEND-BUFFER
我的最后MAXLEN
值为0000
而不是m
i.e
m:19
0000
m:20
MAXLEN
答案 0 :(得分:1)
您使用 intfile.oper[m]
功能正在阅读 sscanf
,但打印 intfile.oper[0]
。
if(count==3)
{
sscanf(intfile.line[m],"%s %s %s",intfile.label[m],intfile.instr[m],intfile.oper[m]);
printf("label %s, instr %s, oper %s\n",intfile.label[m],intfile.instr[m],intfile.oper[m]);
}
else//if count==2
{
sscanf(intfile.line[m],"%s %s",intfile.instr[m],intfile.oper[m]);
printf("instr %s, oper %s\n",intfile.instr[m],intfile.oper[m]);
}
最后一个操作数MAXLEN
覆盖第一个操作数的原因是因为溢出。您的文件包含 21 文本行,而不是20.您的静态数组只能包含20个值,编号为 0
,最多为19
,因为C数组从零开始。
新修复:
char instr[21][10];
char label[21][10];
与此问题无关,但如果您考虑在其他位置使用此扫描的结果,则可能需要确保label[m]
元素都设置为NULL
。实际上,它们具有使用sscanf
或读取的值,它们包含完全随机的内容。你怎么知道价值是否合法?
另外,请使用函数malloc
和free
查看动态内存分配。首先,您不需要创建一个有希望&#34;希望&#34;对于你的文档而言足够大(那么你就不会遇到这个特殊问题),但其次,你的字符串可能会发生同样的情况。
目前,只要有一个标签&#39;,&#39;指令&#39;或&#39;操作数&#39;超过 9 个字符(不是&#34; 10&#34;!),你会遇到问题。