2017-03-25 1 views
0

par exemple: A1 = 12345, A2 = 222 je veux utiliser memcpy pour faire A1 = 12322entrer int pour A1 et A2, puis utilisez memcpy pour passer un nombre entre A1 et A2, mais incapable de si

Je sais qu'il a quelque chose à voir avec l'octet de mémoire, mais il est évident que je suis ne comprends pas bien comment le travail de mémoire ...

#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

Vous n'initialisez 'n'. – ForceBru

+0

Un 'int' stocke tous les chiffres dans la même variable, et au format binaire. Vous ne pouvez pas indexer ou copier des chiffres décimaux en les indexant. –

+0

Je ne sais pas comment vous avez obtenu '12322' de' 12345' et '222'. –

Répondre

0

de telles choses sont mieux fait avec des chaînes au lieu des entiers.

J'ai pris la liberté et simplifié votre logique un peu, par exemple: j'ai dépouillé la boucle. (Keep it simple en premier et quand que fonctionne bien: aller sur)

#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; 
} 
+0

hey ~ merci pour le code, mais j'ai continué à exécuter msg stderr depuis le début, peu importe le nombre que j'ai entré, il a juste continué à afficher msg stderr. –

+0

btw, existe-t-il un moyen simple de réparer mon code? je veux garder int * en utilisant malloc, peut-être convertir A1 et A2 en char pour eux à memcpy? –

+0

@LingLingLing Oh? C & P typo? Non, fonctionne comme prévu avec les entrées 1234 et 222. Quels messages obtenez-vous? Non, il n'y a pas de moyen simple de corriger votre code si vous voulez (besoin?) Utiliser 'memcpy()'. Si vous souhaitez conserver le pointeur int, vous pouvez créer une chaîne à partir de 'int' avec, par exemple,' 'nsfprintf()' et le récupérer avec, par exemple, 'atoi()'. – deamentiaemundi