Domanda Risolto Convertire array di char ad int

  • Autore discussione Utente cancellato 275459
  • Data d'inizio
U

Utente cancellato 275459

sera gente sto provando a convertire un array di char ad int il codice è questo:
C:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int my_atoi(char *array) {
    int *x;
    x=(int32_t) malloc(sizeof(array));
    return x;
    
}

int main(int argc, char *argv[]) {
    char hello[]="30";
    int x=my_atoi(hello);
    printf("%d\n",x);
}
i miei dubbi principali sono:
se alloco la var x nell'heap poi come posso liberarla?
perché non funziona?
 
Non hai bisogno di allocare memoria per implementare atoi
C:
int my_atoi(char *array) {
    int x = 0;
    for (int i = 0; array[i] != '\0'; i++) {
        // your code here
    }
    return x;
}
 
Mi ha preceduto St3ve.

Aggiungo solo che devi sottrarre alla i-esima posizione il valore '0', e poi sommare questo valore al risultato (x, nel codice di St3ve) moltiplicato per 10; dando per scontato che l'input sia corretto, x= (x*10) + (array[i] - '0');. Ovviamente dovrai aggiungere controlli per gestire anche i numeri negativi.

Comunque nel tuo codice stai solo allocando memoria, non stai facendo altro.
 
ok credo di averlo finito, esiste un algoritmo per convertire un numero da positivo a negativo? esempio: se ho -35 e lo voglio convertire a 35 come posso fare?
 
Ultima modifica:
C:
int abs(int n) { return n < 0 ? -n : n; }
Spesso lo si vede in forma di macro
C:
#define abs(n) ((n) < 0 ? -(n) : (n))
che richiede un eccessivo uso di parentesi perché altrimenti cose come abs(a+b) rischiano di diventare -a+b invece di -(a+b).

Per farlo diventare da positivo a negativo (e i negativi restano negativi) devi usare > invece di < in quel che ti ho appena scritto. Oppure usi -abs(n).
 
grazie mille un ultima cosa: per rimuovere il primo carattere in un array come posso fare? ho provato cosi:
char hello[]="-10";
hello[0]='\0';
però mi da errore
 
se metto array++ mi passa un valore in più, però io devo levare il meno, il codice che ho fatto è questo:
C:
int my_atoi(char *array) {
    int x=0;
    for (int i = 0; array[i] != '\0'; i++) {
        int size_array=sizeof(array)/sizeof(array[0]);
        if (array[0]=='-') {
            array++;    //è qui che mi blocco perché non so come levare il '-' iniziale dell'array
            x= (x*10) + (array[i] - '0');
            x=-x;
        } else {
            x= (x*10) + (array[i]-'0');
        }
    }
    return x;
}
 
Ti fixo il codice senza modificarti l'algoritmo. Non è ideale mettere l'if all'interno del ciclo.
C:
int my_atoi(char *array) {
    int x = 0, sign = 1;
    for (int i = 0; array[i] != '\0'; i++) {
        if (array[0]=='-') {
            sign = -1;
        } else {
            x= (x*10) + (array[i]-'0');
        }
    }
    return sign * x;
}

Nota che questa cosa qui
C:
int size_array=sizeof(array)/sizeof(array[0]);
oltre al fatto che non ti serve a niente, non funziona. Funzionerebbe se la variabile array fosse veramente un array, ma in C non puoi passare un array a una funzione e devi per forza passare il puntatore. La variabile array è un puntatore e la sua dimensione è tipicamente di 8 bytes (su architetture a 64 bit).
 
a me da errore lo stesso, il problema penso sia questo:
C:
x= (x*10) + (array[i]-'0');
perché funziona solo con gli uint e volevo cercare di rimuovere il '-' dall'array, converirlo ad int e poi rimettergli il '-', per rimettere il '-' all int non ho problemi però come faccio a levare il primo carattere ad una stringa? così posso convertirlo ad int
 
Sì, ho fatto direttamente dal forum e mi è sfuggito il controllo dell'if: if (array[i]=='-') {.

In alternativa puoi fare una cosa di questo tipo
C:
int my_atoi(char *array) {
    int x = 0, sign = 1;

    if (array[0]=='-') {
        sign = -1;
        array++;
    } else if (array[0]=='+') {
        sign = 1;
        array++;
    }

    for (int i = 0; array[i] != '\0'; i++) {
        x= (x*10) + (array[i]-'0');
    }

    return sign * x;
}
giusto per farti capire cosa intendevo con array++ per skippare il primo elemento.