例如: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);
}
}
答案 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;
}