C语言 为 A1 和 A2 输入 int,然后使用 memcpy 在 A1 和 A2 之间切换一些数字,但无法这样做



例如: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 intn");
    while(scanf("%d",&n) != EOF){
        int *A1 = (int *)malloc(sizeof(int)*n); 
        int *A2 = (int *)malloc(sizeof(int)*n);
        printf("enter A1 numbern");
        scanf("%d",A1);
        printf("enter A2 numbern");
        scanf("%d",A2);
        memcpy(A1+3,A2+2,sizeof(int));
        printf("A1= %dn",*A1);
    free(A1);
    free(A2);
    }
}

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

我冒昧地简化了你的逻辑,例如:我剥离了循环。(首先保持简单,当效果良好时:继续(

#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] = {''};
  // 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 checkn", 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 scanfn");
    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 A1n", n);
    return EXIT_FAILURE;
  }
  char *A2 = calloc(n, 1);
  if (A2 == NULL) {
    fprintf(stderr, "Failure to allocate %zu bytes for A2n", n);
    return EXIT_FAILURE;
  }
  printf("enter A1 numbern");
  // 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 A1n",
              strerror(errno));
    } else {
      fprintf(stderr, "An error occured while scanning for A1n");
    }
    return EXIT_FAILURE;
  }
  printf("enter A2 numbern");
  err = scanf(format, A2);
  errno = 0;
  if (err != 1) {
    if (err == EOF) {
      fprintf(stderr, "The error %s occured while scanning for A1n",
              strerror(errno));
    } else {
      fprintf(stderr, "An error occured while scanning for A1n");
    }
    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= %sn", 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 = %dn", binary_number);
  free(A1);
  free(A2);
  return EXIT_SUCCESS;
}

相关内容

最新更新