Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [c] int in string

  1. #1
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803

    [c] int in string

    salve,
    cercando sul web ho trovato solo la funzione atoi, ma per il compilatore sembra non esistere (per il man di linux uguale)
    il problema è scrivere un intero in un file con la syscall write..

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Precisamente, cosa devi fare?

    Devi scrivere proprio un intero su un file o devi prima convertire questo intero in un carattere e poi scriverlo sul file? Le cose sono leggermente diverse... spiega meglio il problema.
    every day above ground is a good one

  3. #3
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da YuYevon
    Precisamente, cosa devi fare?

    Devi scrivere proprio un intero su un file o devi prima convertire questo intero in un carattere e poi scriverlo sul file? Le cose sono leggermente diverse... spiega meglio il problema.
    il problema è scrivere un intero su file come ho precisato dopo, la mia soluzione ipotizzata è convertire intero in stringa..ho un pò incasinato le richieste

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Beh come ti dicevo le cose sono diverse. Se ho ben capito, quello che vuoi fare tu è che se hai il numero 5 (cioè dichiarato proprio come int, short o quello che è) vuoi scrivere 5 nel file, cioè vuoi leggere 5 quando poi apri il file con un editor di testo... dico bene? Te lo chiedo perché se volessi scrivere quel 5 proprio come intero (e non come carattere!) nel file, aprendo poi quest'ultimo con un editor di testo non leggeresti il carattere 5 ma i caratteri ASCII corrispondenti ai byte che costituiscono il numero 5, ovviamente se questi sono stampabili.

    In ogni caso, se il tuo problema è convertire un numero in stringa e non hai atoi, puoi sempre ricorrere a ssprintf() o per megio dire a snprintf()

    http://www.cplusplus.com/reference/c...stdio/sprintf/

    http://digilander.libero.it/uzappi/C...ni/printf.html
    every day above ground is a good one

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    Al di là del fatto che "atoi" fa esattamente il contrario di quello che stai chiedendo (ovvero, converte una stringa in un intero: "123" -> 123), la funzione che ti serve è l'esatto opposto: itoa(), che converte un intero in stringa (123 -> "123").

    Cercando con goole saltano fuori milioni di risultati. Uno su tutti: http://www.cplusplus.com/reference/c.../cstdlib/itoa/

    Puoi anche usare la funzione sprintf() (anche qui, google aiuta).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da LeleFT
    Al di là del fatto che "atoi" fa esattamente il contrario di quello che stai chiedendo (ovvero, converte una stringa in un intero: "123" -> 123), la funzione che ti serve è l'esatto opposto: itoa(), che converte un intero in stringa (123 -> "123").

    Cercando con goole saltano fuori milioni di risultati. Uno su tutti: http://www.cplusplus.com/reference/c.../cstdlib/itoa/
    E' vero, ma iota() non è standard ANSI e molti compilatori potrebbero non supportarla (comunque probabilmente intendeva dire proprio iota() e non atoi()... boh)

    Puoi anche usare la funzione sprintf() (anche qui, google aiuta).
    è decisamente la soluzione migliore, e sarebbe ancora meglio usare snprintf().
    every day above ground is a good one

  7. #7
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da YuYevon
    Se ho ben capito, quello che vuoi fare tu è che se hai il numero 5 (cioè dichiarato proprio come int, short o quello che è) vuoi scrivere 5 nel file, cioè vuoi leggere 5 quando poi apri il file con un editor di testo... dico bene? Te lo chiedo perché se volessi scrivere quel 5 proprio come intero (e non come carattere!) nel file, aprendo poi quest'ultimo con un editor di testo non leggeresti il carattere 5 ma i caratteri ASCII corrispondenti ai byte che costituiscono il numero 5, ovviamente se questi sono stampabili.
    a scanso di equivoci è esattamente questo quello che devo fare, ed il problema della scrittura dell'intero su file che hai spiegato è proprio quello che mi ha orientato verso una funzione di conversione int in string.

    si, volevo intendere itoa (o iota?) ho confuso le funzioni.
    le soluzione che avete dato con scritture bufferizzate sicuramente funzionaranno,
    ma il problema è che dell'esercizio che sto facendo vi ho presentato solo questo problema di scrittura, in realtà è molto più ampio..e con scritture bufferizzate ho problemi, per questo devo usare la write pura.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da ant_alt
    si, volevo intendere itoa (o iota?) ho confuso le funzioni.
    itoa, che sta per Integer TO Ascii, o qualcosa del genere.

    Originariamente inviato da ant_alt
    le soluzione che avete dato con scritture bufferizzate sicuramente funzionaranno,
    ma il problema è che dell'esercizio che sto facendo vi ho presentato solo questo problema di scrittura, in realtà è molto più ampio..e con scritture bufferizzate ho problemi, per questo devo usare la write pura.
    Guarda che la s*printf() ti serve solo a convertire il numero da intero a stringa, poi una volta ottenuta la stringa puoi tranquillamente scriverla nel file con la funzione write().

    codice:
    #include <stdio.h>
    
    int main(void) {
    
    	int x;
    
            char buffer[5];
    
            scanf("%d", &x);
    
    	snprintf(buffer, 5, "%d", x);
    
            printf("Numero convertito in stringa: %s\n", buffer);
    
    	return 0;
    }
    EDIT:

    o forse devi proprio evitare, in generale, istruzioni di input/output bufferizzate? In tal caso mi sa che non ti resta altro che scrivertela di tua mano la funzione per la conversione... che del resto non è difficile.
    every day above ground is a good one

  9. #9
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da YuYevon
    codice:
    #include <stdio.h>
    
    int main(void) {
    
    	int x;
    
            char buffer[5];
    
            scanf("%d", &x);
    
    	snprintf(buffer, 5, "%d", x);
    
            printf("Numero convertito in stringa: %s\n", buffer);
    
    	return 0;
    }
    alla fine ho risolto con snprintf

    solo una cosa: qualcuno saprebbe dirmi al volo come evitare di sprecare spazio?
    per capirci nell'esempio è buffer[5]..c'è modo di sapere i digit di un intero?
    ossia: int a=1200; mi serve una funzione per sapere che sono 4

    non che sia un problema allocare 10byte, ma da programmatori capirete che allocare spazio inutile non è proprio simpatico

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    L'unico modo che mi viene in mente in questo momento per conoscere la lunghezza (in "numero di cifre") di un numero è questo, che poi alla fine è proprio parte dell'algoritmo che si usa per convertire un intero in stringa corrispondente:

    codice:
    do (
    
         x /= 10;
         cnt++;
    
    } while ( x );
    dove x è il nostro intero e cnt un contatore, inizializzato ovviamente a 0.

    Supponiamo di avere il numero 61719.

    DIvidendolo per dieci abbiamo che il quoto è 6171 (con resto 9, ma non ci interessa). Dividendolo ancora per 10 abbiamo 617, poi 61, poi 6 e infine 0. Quindi finché x non è 0 ( "while(x)" ) dividiamo x per 10 e lo aggiorniamo. Alla fine, il numero delle divisioni ci darà proprio la lunghezza di x originario.

    Questo è un modo, ma ovviamente per non allocare staticamente appena 10 byte di memoria abbiamo fatto un ciclo iterativo... quindi abbiamo risparmiato memoria ma gravato sul tempo di cpu (parole piuttosto grosse per una situazione del genere ^^).

    Quello che è certo, però, è che conoscendo esattamente la lunghezza del numero siamo sicuri di allocare tanto spazio quanto ne serve, perché se ad esempio dichiarassimo un buffer statico di 10 elementi e immettessimo un numero di 11 cifre (come long long int ad esempio), le cose non andrebbero bene. Certo basterebbe dichiarare un buffer magari di 20 elementi... insomma è questione di gusti!
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.