【问题标题】:Splitting an array into two in C在C中将数组分成两部分
【发布时间】:2017-04-01 13:22:25
【问题描述】:

我正在尝试将一些二进制代码转换为程序集,但作为任务的一部分,我不确定如何将数组中的最后 5 个元素(共 8 个)转换为新数组。如您所见,我已经设法为操作码(前 3 个元素)创建了一个数组,但不确定如何将操作数放入新数组或编辑初始数组。

感谢所有帮助。

void convert_to_assembly(char bin[])
{
  int i;
  printf("The binary code before spiliting is: ");
  char binary[9] = {'1','0','1','1','1','1','1','0'};
  for(i=0;i<=7;i++)
  {
    printf("%c",binary[i]);
  }
  printf("\n");

  char opCode[4];
  strncpy(opCode,binary,3);
  printf("opcode: "); 
  for(i=0;i<3;i++)
  {
    printf("%c",opCode[i]);
  }
  printf("\n");
}

输出

The binary code before splitting is: 10111110
opcode : 101
operand: ???????

【问题讨论】:

  • Picky:您的意思是只初始化 9 数组的 8 个元素吗?如果您打算将其用作字符串,则最后一个元素不会自动初始化为'\0'
  • @WeatherVane 我认为他这样做是因为他的循环明确计算了 8 个元素。
  • @WeatherVane 我认为这是 0 终止字符数组的一种方法,因此有一个 C 字符串。 =P。不完全直观,未指定的尾随内容零是否填充了指定长度的序列? (今天早上错过了我的咖啡,对不起,如果我要休息)。
  • @WhozCraig mybad:未指定的元素将默认初始化为0
  • 你试过strncpy(bin, binary+3, 5); 吗?并不是说将数据复制到长度未指定的目标中是最好的主意,也没有确定的终止,但仍然。

标签: c arrays assembly split


【解决方案1】:

如果我理解正确的话,这对我有用(基于@WhozCraig):

void convert_to_assembly(char bin[])
{
  int i;

  printf("The binary code before spiliting is: ");

  char binary[9] = "10111110\0";
  printf("%s\n",binary);

  char opcode[4];
  char operand[6];

  strncpy(opcode,binary,3);
  opcode[3]='\0';
  strncpy(operand,binary+3,6);
  printf("opcode: %s\n",opcode);
  printf("operand: %s\n",operand);
}

strncpy 将从binary+3 开始的6 个字符复制到operand,这将从第四个元素开始复制接下来的六个元素。

【讨论】:

  • 是的,这正是我想要的。非常感谢!
  • 没问题!感谢@WhozCraig!
  • 我很好奇,为什么是opcode[3]='\0';?我的意思是,为什么不把零简单地写成零呢? opcode[3]=0;?
  • opcode[3]=0; 应该也可以,我只是习惯写成'\0'
【解决方案2】:

由于二进制字符串包含所有信息,我们可以使用union 将操作码和操作数视为覆盖视图,而无需创建新数组或编写代码来拆分数据:

#include <stdio.h>
#include <string.h>

union word {
    char binary[8];
    struct operation {
        char opcode[3];
        char operand[5];
    } opvar;
};

void convert_to_assembly(char *bin) {
    union word op;

    (void) strncpy(op.binary, bin, sizeof(op.binary));

    printf("before splitting: %.8s\n", op.binary);
    printf("opcode: %.3s\n", op.opvar.opcode); 
    printf("operand: %.5s\n", op.opvar.operand);
}

int main() {

    convert_to_assembly("10111110");

    return 0;
}

输出

> ./a.out
before splitting: 10111110
opcode: 101
operand: 11110
>

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 2014-10-21
    • 2011-11-26
    • 1970-01-01
    • 2020-09-21
    • 2019-02-09
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多