【问题标题】:strcpy issue with char arrays in structs in CC中结构中的char数组的strcpy问题
【发布时间】:2014-11-12 04:16:11
【问题描述】:

所以我正在开发一个程序来接收文本文件中的汇编代码并生成相应的机器代码。但是,当我尝试将值分配给组装流水线结构的成员时,我遇到了一个问题。发生的情况是,当“.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 之前,字符串可以正常读取。 fill 是用作 strcpy 的关键字还是什么?我想也许它与“。”有关。但是当操作码为“.lw”时,这不会影响任何事情。

抱歉这篇文章太长了!感谢您的帮助!

【问题讨论】:

  • 你知道 cstrings 是 0 终止的吗?
  • @RickyMutschlechner:是的,这看起来是唯一有效的用途。也许……
  • @Deduplicator 是的,我想用一个明确的字符串

标签: c struct strcpy opcode c-strings


【解决方案1】:

字符串“.fill”的长度为 5 个字符 + 1 个零字符。这使得 6 个字符。 但是数组“操作码”只有 5 个字符长,所以尾随零被写入“arg0”。 之后,将“5”(2 个字符为零)复制到“arg0”。 因为 'printf' 会一直打印到出现尾随零,所以它会读取操作码的边界。

【讨论】:

  • 谢谢!我看了很长时间,试图弄清楚出了什么问题!
【解决方案2】:

您的数组不够大。 ".fill" 是六个字符,包括终止的空值,但您只能使用 char opcode[5] 为五个字符分配内存。你需要让你的数组更大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2019-08-22
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    相关资源
    最近更新 更多