gpt4 book ai didi

c - 结构体中存储的值发生变化

转载 作者:行者123 更新时间:2023-11-30 15:30:49 26 4
gpt4 key购买 nike

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

对于最后一个 m 值,我得到的是 MAXLEN 而不是 0000

i.e

m:19

0000

m:20

MAXLEN

最佳答案

您正在阅读 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 。首先,您不需要创建一个“希望”足够大的数组来容纳您的文档(这样您就不会遇到这个特定问题),但其次,您的字符串也可能会发生同样的情况.
目前,只要单个“标签”、“指令”或“操作数”长度超过 9 个字符(不是“10”!),您就会遇到问题。

关于c - 结构体中存储的值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25327426/

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