Newsgroup: it.comp.lang.c++
Titolo: INTtoSTR() si può fare?

Come da oggetto, è possibile convertire un'intero in una stringa?
Grazie
Luigi
-- 
Posted from 
smtp2.libero.it
 [193.70.192.52] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:3AAD265E...@hotmail.com...


A me serve per g++, il compilatore sotto Linux
-- 
Posted from 
smtp1.libero.it
 [193.70.192.51] 


A me serve per g++, il compilatore sotto Linux
Allora no, sotto linux è praticamente impossibile convertire un intero
in una stringa. Anche con windows è necessario istanziare una classe
che sfrutta il 100% del processore per alcuni secondi bloccando
l'esecuzione di tutti gli altri task, per cui anche con questo sistema
raramente viene effettuata questa conversione.
Alcuni studi recenti dimostrano altresi che per programmare in c++
sono necessare alcune *minime* basi...
Luc.

 A me serve per g++, il compilatore sotto Linux
Hai provato ad usare *itoa* per convertire un intero
in un array di caratteri e poi inserirlo in una stringa?
Mi sembra un compromesso accettabile (e standard :D)
Bow-wow
Killer

 writes:

itoa non e' standard :D
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it
The instructions said to use Windows 98 or better - so I installed FreeBSD.

 sono necessare alcune *minime* basi...
Infatti.


1000000 di conversioni intero -> ostringstream:
Infatti, era una presa per il c... ^_______^
Luc.

 itoa non e' standard :D
Azz, lo sospettavo, ma ci ho provto :D
Bow-wow
Killer


Ciao,
la itoa() non e´ standard.
Questa e´ la itoa() versione Kernighan & Ritchie, che usa char[],
quella con le stringhe viene...di conseguenza :-o)
#include <string.h>
void reverse(char s[])
{
   int c, i, j;
   for (i = 0, j = strlen(s) -1, i < j; i++, j--)
   {
      c = s[i];
      s[i] = s[j];
      s[j] = c;
   }
}
void itoa(int n, char s[])
{
   int i, sign;
   if ((sign = n) < 0)
      n = -n;
   i = 0;
   do
   {
      s[i++] = n % 10 + '0';
   } while ((n/= 10) > 0);
   if (sign < 0)
      s[i++] = '-';
   s[i] = '\0';
   reverse(s);
}

ma in g++ itoa() dov'è definita?
In ctype.h? 
Io non ci ho trovato nemmeno atoi in ctype.h
Grazie


Ma la itoa() non dovrebbe ritornare una stringa invece che essere void?
E poi cosa devo passare come argomento alla itoa()?  
Ad es. se il numero è 123, che array di char passo?
Grazie
Luigi


Luigi
Ciao Luigi,
ti ricordo che la itoa(), come implementata nel precedente post ha 2
argomenti:
void itoa(int n, char s[])
Il ritorno e´ void perche´ non deve ritornare nulla, essendo il secondo
argomento un indirizzo dove mettere la stringa costruita nella funzione.
Se per esempio tu volessi convertire l´intero 123 in una stringa dovresti
prima della chiamata allocare spazio per la stringa da costruire e poi
chiamare la itoa con il numero da convertire come primo argomento e
l´indirizzo dove mettere la stringa come secondo argomento.
Eccoti un esempio completo, questo e´ in C, il tradurlo in C++ non dovrebbe
essere complicato, dovresti usare il tipo string al posto di char[]:
#include <string.h>
#include <iostream>
using namespace std;
void reverse(char s[])
{
   int c, i, j;
   for (i = 0, j = strlen(s) -1; i < j; i++, j--)
   {
      c = s[i];
      s[i] = s[j];
      s[j] = c;
   }
}
void myitoa(int n, char s[])
{
   int i, sign;
   if ((sign = n) < 0)
      n = -n;
   i = 0;
   do
   {
      s[i++] = n % 10 + '0';
   } while ((n/= 10) > 0);
   if (sign < 0)
      s[i++] = '-';
   s[i] = '\0';
   reverse(s);
}
int main()
{
   char *p = new char[10];
   int i = 123;
   myitoa(i, p);
   cout << "Il numero " << i << " e´ stato convertito nella stringa " << p
<< endl;
   return 0;
}
Ciao
Mauro

 Io non ci ho trovato nemmeno atoi in ctype.h
man atoi; devi guardare in <cstdlib>.


>Io non ci ho trovato nemmeno atoi in ctype.h
atoi() è dichiarata in stdlib.h
Lanugo

Grazie, ora č tutto piů chiaro.
Per caso ce l'hai una ftoa() ? ;)
Ciao


Allora se metto stringa invece che char
cambio l'argomento di reverse(char s[]), il secondo di itoa e nel
main non alloco memoria per la stringa?
L'ho provato il codice di prova, ma me la da invertita (321). Dovrei
richiamare reverse?
Grazie


Eccolo:
#include <iostream>
#include <string>
void reverse(char s[]) {
int c, i, j;
   for (i = 0, j = strlen(s) - 1, i < j; i++; j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
   };
};
void itoa(int n, char s[]) {
int i, sign;
        if ((sign = n) < 0)
                n = -n;
        i = 0;
        do {
                s[i++] = n % 10 + '0';
        }
        while ((n /= 10) > 0);
                if (sign < 0)
                        s[i++] = '-';
                s[i] = '\0';
                reverse (s);
};
int main () {
        char* p = new char[10];
        int i = 123;
        itoa (123, p);
        std::cout << p << std::endl;
        return 0;
}
Inoltre volevo dirti che siccome programmo in Linux, uso il g++ e non
c'è traccia di <sstream> usata nel tuo codice che fa uso di template.
Grazie
Luigi
-- 
Posted from 
smtp2.libero.it
 [193.70.192.52] 



Luigi non fare confusione,
se hai provato l´esempio, la funzione reverse e´ gia´chiamata all´interno
della itoa() per cui la stringa non e´ invertita.
Ora ti posto il codice per convertire interi in stringhe in stile C e per
convertire altri tipi (interi, float, double ecc..) in stringhe in stile
C++.
Copia e incolla l´esempio e controlla se funziona il tutto.
#include <string.h>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
// conversione in stile C++
template <class T>
class t2string
{
    string str_;
public:
    t2string( T f_)
    {
        ostringstream str;
        str << f_;
        str_ = str.str();
    }
    operator string()    {    return str_;}
};
void reverse(char s[])
{
   int c, i, j;
   for (i = 0, j = strlen(s) -1; i < j; i++, j--)
   {
      c = s[i];
      s[i] = s[j];
      s[j] = c;
   }
}
// conversione in stile C
void myitoa(int n, char s[])
{
   int i, sign;
   if ((sign = n) < 0)
      n = -n;
   i = 0;
   do
   {
      s[i++] = n % 10 + '0';
   } while ((n/= 10) > 0);
   if (sign < 0)
      s[i++] = '-';
   s[i] = '\0';
   reverse(s);
}
int main()
{
   // alloco memoria per p
   char *p = new char[10];
   int i = 123;
   float f = static_cast<float>(123.123);
   t2string<float> fstr(f);
   t2string<int> istr(i);
   myitoa(i, p);
   cout << "Il numero " << i << " e' stato convertito nella stringa "
      << p << " da myitoa()" << endl;
   // dealloco la memoria
   delete []p;
   cout << "Il numero " << f << " e' stato convertito nella stringa "
      << static_cast<string>(fstr) << " dal template" << endl;
   cout << "Il numero " << i << " e' stato convertito nella stringa "
      << static_cast<string>(istr) << " dal template" << endl;
   return 0;
}
Se hai qualche dubbio o qualcosa non va domanda pure.
CIao
Mauro

 se hai provato l´esempio, la funzione reverse e´ gia´chiamata all´interno
Si,l'ho provato per come l'hai scritto, e me la da invertita... (321)
Ciao
-- 
Posted from 
smtp1.libero.it
 [193.70.192.51] 


Ciao
Per favore, postami il codice completo che ti da´ la stringa convertita
invertita, lo compiliamo e linkiamo insieme e guardiamo il risultato.
Poi semmai chiameremo l´esorcista.:-)
Ciao
Mauro

Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:
Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: 
Vi bastano? 8/
Luc.


Ciao Luigi,
fra la mia reverse e la tua c´e´ una piccola differenza...della serie aguzza
la vista come nei concorsi della settimana enigmistica.
La prossima volta ti consiglio di fare un copia e incolla.
Ecco ancora una volta la mia versione:
void reverse(char s[])
{
   int c, i, j;
   for (i = 0, j = strlen(s) -1; i < j; i++, j--)
   {
      c = s[i];
      s[i] = s[j];
      s[j] = c;
   }
}
Per quanto riguarda <sstream> e´ nello standard C++ per cui ti suggerirei di
aggiornare il tuo compilatore.
Ciao
Mauro
P.S.
Non posso farci nulla per quanto riguarda i Re: i miei reply non li
aggiungono, non so come mai Luigi quando risponde ha qualche automatismo nel
gestore delle sue news che gli aggiunge un Re.

 nel gestore delle sue news che gli aggiunge un Re.
Uso Libero e come client KNode
ciao
--
Luigi

Uso Libero e come client KNode
Metti a posto KNode o cambia newsreader.
Luc.