Newsgroup: it.comp.programmare.win32
Titolo: [Neofita] - Convertire una stringa in un intero

Salve a tutto il NG!
Dovrei convertire una stringa in un numero, qualcuno sa darmi un
indicazione?
Grazie 1000

 wrote in message
news:b1m2ka$d9q$1...@monty.lombardiacom.it...

In italiano in inglese o in tedesco?
Maurus


In C puoi usare la sscanf (sscanf(str_num, "%d", &num);). Comunque dipende
dal linguaggio che stai usando.
Ciao.
Luca

 ha scritto nel messaggio
news:b1m35m$i6r$1...@galileo.it.ip-plus.net...

Si scusa hai ragione, uso VC++ 6. Penso che potrei usare anche qui la
sscanf.
Grazie

sscanf.
Per lo scopo che ti prefiggi si usa strtol() o strtoul().
-- 
Andrea Laforgia
#exclude <windows.h>

 sscanf.
atoi()
-- 
Luc.

 Luc.

 
Se non ti vuoi legare al runtime del C puoi usare la funzione StrToInt e 
amici esportata da shlwapi.dll 4.71 o maggiore (quindi da Win95+IE4 in 
poi).
Luca

 ha scritto nel messaggio
news:MPG.18a912289...@powernews.libero.it...

Grazie Luca,
quindi devo importare questa dll nel mio progetto, giusto? E poi richiamare
la funzione strtoint(), dico bene?

 richiamare la funzione strtoint(), dico bene?
Si, devi includere nel progetto la corrispondente .lib e includere nel
codice il file .h (trovi tutto descritto sull'help del PSDK o nella
documentazione di MSDN se l'hai, se no la puoi consultare via web
(
http://msdn.microsoft.com
 e poi spulcia...). Ricordati le
maiuscole/minuscole, devi usare StrToInt.
Luca

la funzione strtoint(), dico bene?
Una curiosità: che c'è in strtol() che non va ?


 #exclude <windows.h>
sbirish

"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:g13v3v8i6th455hgt...@4ax.com...

Non c'è nulla che non va, sono un neofita, quindi prima imparo ad utilizzare
StrToInt e poi anche strtol :-)
Grazie 1000 Andrea

StrToInt e poi anche strtol :-)
Se sei un neofita, *PRIMA* devi imparare ad usare le caratteristiche
standard di un linguaggio e *DOPO* quelle non standard... strtol() č
il modo comune, in C, di trasformare un numero in intero ed č quello
supportato da tutte le piattaforme ISO C/C++ compliant (leggi:
portabile).  Non capisco che necessitŕ ci sia, tutte le volte, di
complicare le cose in modo cosě perverso.


 #exclude <windows.h>
Lo so che dovrei imparare prima lo standard, ma complicarmi la vita è il mio
forte :-)
Comunque ho provato la strol() ma forse non riesco a farla funzionare, anche
con StrToInt() ho avuto questo problema, e cioé se io scrivo una stringa
alfanumerica mi sta bene che la converte, ma se gli passo una stringa
numerica (ad esempio 123) vorrei che fosse convertita in un long di valore
123, ma non ci riesco, mi sai indicare la strada corretta?
Grazie

123, ma non ci riesco, mi sai indicare la strada corretta?
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
   char *string = "87654321", *endptr;
   long lnumber;
   lnumber = strtol(string, &endptr, 10);
   printf("string = %s  long = %ld\n", string, lnumber);
   return 0;


"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:b5fv3vsvq34qduka7...@4ax.com...

Io sto cercando di creare un'applicazione di calcolo, la classica
calcolatrice.
Ho settato la mia variabile dove viene scritto il risultato come CString, e
in questo modo non mi converte correttamente 123 in 123 (intero).
Utilizzando il frammento di codice che mi hai gentilmente passato, mi da
errore quando a *string cerco di dargli il valore di CString, ovviamente.
Devo modificare tutta l'applicazione e mettere la variabile di tipo char? O
posso convertire la CString in char? Scusa se sono un pò incasinaro ma devo
imparare a non creare problemi :-)


Converti la CString in char * usando operator LPCTSTR della CString stessa.
Maurus

Devo modificare tutta l'applicazione e mettere la variabile di tipo char? 
No, se CString (che non conosco) è derivata dall'oggetto std::string
standard del C++ o è costruita sullo stesso principio, allora dovresti
usare il metodo c_str() per ottenere un const char *.


"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:3uqv3vs78muisfd4u...@4ax.com...

Ti ringrazio Andrea, ho risolto il tutto con la funzione atoi().

"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:g13v3v8i6th455hgt...@4ax.com...

Dal momento che ci troviamo nel gruppo icp.win32 suppongo stia scrivendo un
programma per Windows, quindi se non vengono usate funzioni esportate dal
runtime perche' includerlo solo per una atoi? Windows mette a disposizioni
delle alternative, che poi non siano portabili e' tutto un altro discorso
(ma un programma per Win32 GUI quanto e' portabile se non scritto con mille
accorgimenti?)
Luca

Ti ringrazio Andrea, ho risolto il tutto con la funzione atoi().
Argh !... atoi() è normalmente etichettata come "deprecated".
Oltre ad avere l'antipatico difetto di restituire 0 se la stringa non
può essere convertita (quindi per "0" e per "pippo" dà lo stesso
risultato), non è thread-safe.  Non capisco cosa ci sia in strtol()
che non va...


Windows mette a disposizioni delle alternative,[...]
Le alternative non servono, quando la soluzione ce l'hai sotto al naso
;-)


, x@x.x says...

Ma la msvcrt.dll e' una dipendenza in piu', una dll in piu' da caricare 
all'avvio dell'applicazione. Se gia' la shlwapi.dll e' usata per altre 
funzioni nel programma (possibilita' tutt'altro che remota) perche' 
rallentare il caricamento dell'applicazione per nulla?
Luca

rallentare il caricamento dell'applicazione per nulla?
Vuoi dirmi, per caso, che il Visual C++ non prevede la possibilità di
linkare il run-time staticamente ?  Io, poi, parlo di regola generale,
a prescindere dal compilatore utilizzato.  L'applicazione, poi, non
viene per nulla rallentata.


 Ma la msvcrt.dll e' una dipendenza in piu', [...]
no. C'è anche libc.lib, linkata staticamente e che importa solamente da 
kernel32.dll. Ovviamente senza contare il gran numero di DLL di Windows 
che importa da msvcrt.dll. Il discorso non sta in piedi
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.0.21. C/C++ and ASM developers
                               and beta testers are welcome!

      async-cancel safe.
Io leggo "*implementation* notes". Cioè *la loro* non è thread-safe, ma 
non vedo che razza di problemi potrebbe dare una funzione tanto banale. 
Oltretutto, la guida che ho io (Single Unix Specification v2) dice:
"[...]
DESCRIPTION
The call atoi(str) is equivalent to: 
(int) strtol(str, (char **)NULL, 10)
except that the handling of errors may differ. If the value cannot be 
represented, the behaviour is undefined.
[...]"
Comunque, strtol() *è* migliore e andrebbe usata al posto di atoi(), ma 
perchè strtol() è più completa, mica per altro


 perchè strtol() è più completa, mica per altro
sscanf sarebbe migliore di strtol da questo punto di vista :)
si potrebbe dire che se è solo un wrapper su strtol chiamando strtol si
potrebbe
risparmiare una function call.. but who cares?
alla fine atoi è più leggibile se è sufficiente la 'conversione' in base 10
e se si è sicuri che sia safe.
Credo di esseer finito ot cmq.. onestamente credevo il post appartenesse a
icpc
e non ad icpw32.. posto nel tempo libero.. ed ero distratto..
Chiedo per l'ennesima volta venia.
Uno Sbirish che ha notato ora un buco nel calzino.