所以我正在开发一个程序来在文本文件中接收汇编代码并生成相应的机器代码。但是,当我试图将值赋给AssemblyLine结构的成员时,我遇到了一个问题。当" .fill"是操作码,arg0与它连接,如果我先将值赋给arg0,也会出现arg0的问题。重要的是要注意,这仅在操作码为" .fill"时才会发生。例如,如果操作码是"添加"价值观是我的意图。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct AssemblyLine {
char opcode[5];
char arg0[7];
char arg1[7];
char arg2[7];
_Bool initialized;
};
struct Label {
char name[7];
int address;
_Bool initialized;
};
main()
{
struct AssemblyLine line;
strcpy(line.opcode, ".fill");
strcpy(line.arg0, "5");
printf("%s\n", line.opcode);
return 0;
}
该程序的输出是:
.fill5
我的意图是输出只是:
.fill
我真的很担心导致这种情况的原因。很抱歉,如果答案非常明显,这是我第一次使用C语言,虽然我之前使用过C ++编程。我起初认为没有空终止字符,但是在我使用第二个strcpy之后,字符串才会被读取。填充是用作strcpy的关键词还是什么?我想也许这与&#39;。&#39;但是当操作码是&#34; .lw&#34;时,这并没有影响任何事情。
很抱歉这篇文章太长了!谢谢你的帮助!
答案 0 :(得分:3)
你的阵列还不够大。 ".fill"
是六个字符,包括终止空值,但您只需为char opcode[5]
分配五个内存。你需要让你的阵列更大。
答案 1 :(得分:1)
字符串&#34; .fill&#34;是5个字符+ 1个零字符长。那就是6个字符。 但数组&#39;操作码&#39;只有5个字符长,因此尾随零写入&#39; arg0&#39;。 在那之后,你的副本&#34; 5&#34; (2个字符为零)到&#39; arg0&#39;。 因为&#39; printf&#39;打印直到尾随零发生,它读出操作码的界限。