2017-06-10 2 views
-2

Je viens d'écrire un code pour mon propre itoa (juste pour les nombres positifs) et j'essaie de le rendre le plus efficace possible, j'affiche la valeur depuis l'intérieur de la fonction, et ça marche, mais quand je retire la ligne printf de l'intérieur de la fonction, le code ne marche plus, est-ce que quelqu'un sait pourquoi?Problèmes d'implémentation d'une fonction itoa avec printf et sans

C'est là cela fonctionne

enter image description here

C'est là que ça ne fonctionne pas

enter image description here

Merci pour votre temps! ont une belle journée

Le code:

#include<stdio.h> 
#define uint8_t unsigned char 
#define uint16_t unsigned int 

/*Prototipos de funciones*/ 
uint8_t *UART0_itoa(uint16_t number, uint8_t base); 

/*Función principal*/ 
void main(){ 
    uint8_t *cadena; 
    cadena = UART0_itoa(255, 16); 
    printf("The String in main: %s\n",cadena); 
} 

/*Declaración de funciones*/ 
uint8_t *UART0_itoa(uint16_t number, uint8_t base){ 
    uint8_t *aux; 
    *aux = '\0'; 
    while(number){ 
    *--aux = (number%base>9)?(number%base)+'7':(number%base)+'0'; 
    number/=base; 
    } 
    //printf("The String in the function: %s\n",aux); 
    return aux; 
} 
+2

'aux' est un pointeur. Il ne pointe nulle part ailleurs; vous n'avez pas affecté (ou initialisé avec) aucune valeur. '* aux = '\ 0';' invoque un comportement indéfini. – pmg

+1

'uint8_t * aux; * aux = '\ 0'; 'mais vous n'avez pas initialisé' aux'. –

+0

J'essaie uint8_t * aux = NULL; puis * aux = '\ 0'; mais ne fonctionne toujours pas, existe-t-il un autre moyen? – christianMontero

Répondre

0

Le problème est que vous n'êtes pas allouer de la mémoire à aux - il est un pointeur non initialisé. Tout ce que vous écrivez, y compris l'affectation initiale de *aux = '\0', est un comportement indéfini.

Vous devez modifier le code pour prendre le tampon de sortie ou l'allouer dynamiquement avec malloc. Une tentative d'écrire le nombre est en arrière une belle un - vous pouvez le faire fonctionner en passant la fin de tampon, comme suit:

uint8_t *UART0_itoa(uint16_t number, uint8_t base, char *aux){ 
    while(number){ 
     *--aux = (number%base>9)?(number%base)+'7':(number%base)+'0'; 
     number/=base; 
    } 
    return aux; 
} 

et appelant

char buf[16]; 
cadena = UART0_itoa(255, 16, &buf[15]); 
+0

Merci beaucoup! ça marche et j'apprends quelque chose de nouveau! – christianMontero