存储在结构中的值会发生变化

时间:2014-08-15 13:37:23

标签: c

我正在为系统软件中的程序块编写程序。我将汇编程序的每一行存储到一个数组中。后来我将它们分成了令牌并将它们存放到一个结构中。但我不知道为什么最后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

1 个答案:

答案 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 读取的值,它们包含完全随机的内容。你怎么知道价值是否合法?

另外,请使用函数mallocfree查看动态内存分配。首先,您不需要创建一个有希望&#34;希望&#34;对于你的文档而言足够大(那么你就不会遇到这个特殊问题),但其次,你的字符串可能会发生同样的情况。
目前,只要有一个标签&#39;,&#39;指令&#39;或&#39;操作数&#39;超过 9 个字符(不是&#34; 10&#34;!),你会遇到问题。