为A1和A2输入int,然后使用memcpy在A1和A2之间切换一些数字,但不能这样

时间:2017-03-25 16:19:36

标签: c memcpy

例如:A1 = 12345,A2 = 222 我想用memcpy来制作A1 = 12322

我知道它与内存字节有关,但显然我并不完全理解内存是如何工作的......

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main() {
    size_t n;
    printf("enter how many int\n");
    while(scanf("%d",&n) != EOF){
        int *A1 = (int *)malloc(sizeof(int)*n); 
        int *A2 = (int *)malloc(sizeof(int)*n);

        printf("enter A1 number\n");
        scanf("%d",A1);

        printf("enter A2 number\n");
        scanf("%d",A2);

        memcpy(A1+3,A2+2,sizeof(int));
        printf("A1= %d\n",*A1);

    free(A1);
    free(A2);
    }
}

1 个答案:

答案 0 :(得分:0)

这样的事情最好用字符串而不是整数来完成。

我采取了自由并稍微简化了你的逻辑,例如:我剥离了循环。 (首先保持简单,当 运作良好时:继续)

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
//#include <memory.h>

int main(void)
{
  size_t n;
  int err;
  char format[16] = {'\0'};

  // check the bitsize to evaluate how much memory we need
  // for teh numebr of decimal digits in an int
  n = sizeof(int) * CHAR_BIT;
  // 2^32 = 4294967296 which are 10 characters plus EOS
  if (n == 32) {
    n = 11;
  }
  // 2^64 = 18446744073709551616 which are 20 characters plus EOS
  else if (n == 64) {
    n = 21;
  }
  // I wanted to keep it simple, so fail at <32 bit integers
  else {
    fprintf(stderr, "Unknown int-size %zu, please check\n", n);
    return EXIT_FAILURE;
  }

  // we need to limit the maximum length for scanf() to n -1. This
  // is not possible to do directly we need to build the format string manually
  err = snprintf(format, sizeof(format), "%%%zus", n - 1);
  if (err < 0) {
    fprintf(stderr, "snprintf() failed wile preparing the format for scanf\n");
    return EXIT_FAILURE;
  }

  // we need byte arrays, not integer arrays, hence 'char'.
  // sizeof(char) is always 1 (one) by definition.
  // BTW: don't cast malloc() in C (but do it in C++)

  // calloc() sets the memory to 0 which is quite useful here
  char *A1 = calloc(n, 1);
  if (A1 == NULL) {
    fprintf(stderr, "Failure to allocate %zu bytes for A1\n", n);
    return EXIT_FAILURE;
  }
  char *A2 = calloc(n, 1);
  if (A2 == NULL) {
    fprintf(stderr, "Failure to allocate %zu bytes for A2\n", n);
    return EXIT_FAILURE;
  }

  printf("enter A1 number\n");
  // check return of scanf() (well, always check the returns of every
  // function (with the accepted excepteion of printf())
  errno = 0;
  err = scanf(format, A1);
  if (err != 1) {
    if (err == EOF) {
      fprintf(stderr, "The error %s occured while scanning for A1\n",
              strerror(errno));
    } else {
      fprintf(stderr, "An error occured while scanning for A1\n");
    }
    return EXIT_FAILURE;
  }

  printf("enter A2 number\n");
  err = scanf(format, A2);
  errno = 0;
  if (err != 1) {
    if (err == EOF) {
      fprintf(stderr, "The error %s occured while scanning for A1\n",
              strerror(errno));
    } else {
      fprintf(stderr, "An error occured while scanning for A1\n");
    }
    return EXIT_FAILURE;
  }
  // it is memcpy(destination, source, number of bytes to be copied)
  // Here we copy 2 bytes from A2 to A1 with some offsets, please adjust to your needs

  // You will get into trouble if you don't check if your offsets are inside
  // the allocated memories!
  memcpy(A1 + 2, A2 + 1, 2);

  printf("A1= %s\n", A1);

  // if you want a binary number from it do something in the line of e.g.:
  int binary_number = atoi(A1);
  printf("A1 as an int = %d\n", binary_number);

  free(A1);
  free(A2);

  return EXIT_SUCCESS;
}