Newsgroup: it.comp.lang.c++
Titolo: Stringhe

Salve, in un programma mi sono trovato di fronte ad un problema che non sono
in grado di risolvere. Spero che non sia OT, anche se mi sembra in tema. Il
compilatore, Microsoft Visual C++ mi dice questo:
error C2664: 'strcat' : cannot convert parameter 2 from 'long' to 'const
char *'
        Conversion from integral type to pointer type requires
reinterpret_cast, C-style cast or function-style cast
nella funzione:
strcat(stringa, numero);
dove stringa è un array di caratteri mentre numero è una variabile long.
Praticamente non posso inserire il numero nella stringa? Ma come posso
allora visualizzare il numero? Infatti dopo quell'array mi serve per
inserirlo in una textbox. Spero che bbiate capito il problema, devo
praticamente inserire quel numero (numero) nell'array di caratteri (stringa)
come se fosse una stringa.
Grazie.
---
Ramses
---
http://evilz0ne.cjb.net
http://knowledgeparty.cjb.net

Ramses wrote:

mnn... l'effetto negativo della programmazione visuale... ti consiglio di 
studiarti il C++ sotto Linux, (non che Linux non abbia librerie per 
l'interfacciamento grafico, ma saresti in un ambiente piu' adatto) con un 
bel terminale xterm:)
apparte gli scherzi, non si puo' non leggere la documentazione... adesso io 
lavoro sotto Linux e la documentazione del visual C++ non la ho, ad ogni 
modo se cerchi la informazione per la funzione strcat avrai qualcosa del 
tipo:
SYNOPSIS
       #include <string.h>
 
       char *strcat(char *dest, const char *src);
dove (questo estratto della manual page per strcat) riporta il prototipo 
della funzione, cioe':
- nome della funzione
- argomenti (parametri) della funzione
- valore di ritorno della funzione (cioe' il tipo stesso, della f.)
a questo punto, senza andare nemmeno nella descrizione che indica 
esattamente cosa fa la funzione etc.etc... hai almeno l'indicazione del 
tipo di dato che ha ogni singolo argomento della funzione, nonche' il tipo 
di ritorno... questa e' l'informazione necessaria affinche' il compilatore 
dia l'ok all'uso della funzione, pur non avendo ancora l'informazione sul 
"che cosa fa" la funzione (questione che risolve il linker, fase successiva 
e finale della compilazione). I due argomenti di strcat sono dunque due 
pointer char, e nella fattispecie servono a passare due stringhe: in C/C++ 
le stringhe vengono riferite mediante un puntatore ad una regione di 
memoria di bytes (caratteri) nella quale ci sara' un byte 0 (carattere 
terminatore stringa '\0') indicante il termine della stringa... carattere 
al quale fa riferimento qualsiasi funzione C/C++ che parli di stringhe.
Ordunque, la funzione strcat, come avrai capito, vuole due stringhe, non 
una stringa ed un intero... Per effettuare la concatenazione di un intero 
ad una stringa, dovrai convertire l'intero in stringa e dunque strcat dei 
due, come dal seguente codice:
#include <cstdio> // equival. #include <stdio.h>
#include <cstring> // equival. #include <string.h>
using namespace std;
main()
{
        char tmp_str[40+1];
        char *str = "????? ";
        long int intero = xx;
        sprintf(tmp_str, "%ld", intero);
        strcat(str, tmp_str);
        // ora str = "????? xx"
}
Nota: sprintf e' uguale a printf, in quanto a formattazione, con l'aggiunta 
del fatto che l'output non va a video ma in una stringa (che deve essere di 
dimensione sufficiente all'inserimento del risultato): tale funzione e' 
dichiarata in <stdio.h>. 
Nota2: puoi usare sprintf per fare il tutto, ovviando all'uso di strcat, 
che risulta essere utile quest'ultimo solo per concatenare due stringhe, 
quando hai le stringhe in tale tipo di dato. Nel caso di cui si vuole 
discutere si avra':
#include <cstdio>
using namespace std;
main()
{
        char res_str[40+40+1];
        char *str = "????? ";
        long int intero = xx;
        sprintf(res_str, "%s %ld", str, intero);
        // ora res_str e' come 'str' concatenata nell'es. precedente
}
Nota: #include <cstdio>, seguito dalla dichiarazione del namespace da usare 
come default 'using namespace std' e' uno standard in C++, al quale sarebbe 
consigliabile aderire... declassando l'obsoleta #include <stdio.h>
bye
Lore


bel terminale xterm:)
Questo era un chiaro problema C/C++ e tu tiri in ballo la famigerata
'programmazione visuale'??? Ma voi linuxari la notte dormite o avete i
windows-incubi? 8-PPPPPP

 }
Attenzione: stai cercando di scrivere in un letterale stringa.
Undefined behaviour!
Max
PS: 
Manca 'int' prima di 'main'.

caratteri (stringa) come se fosse una stringa. Grazie. --- Ramses
Se ho capito bene puoi provare con:
char *_<iniziale>toa( int value, char *string, int radix );
con <iniziale> pari alla prima o prime lettere del tipo (es i per integere 
ul per unsigned long ecc.)
T riporto l'esempio di MSDN
  char buffer[20];
  int  i = 3445;
  long l = -344115L;
_itoa( i, buffer, 10 );
printf( "String of integer %d (radix 10): %s\n", i, buffer );
_ltoa( l, buffer, 16 );
printf( "String of long int %ld (radix 16): 0x%s\n", l, buffer );
output
String of integer 3445 (radix 10): 3445
String of long int -344115 (radix 16): 0xfffabfcd
poi prova tu ;-)
_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at 
http://www.hotmail.com
.

Max M. wrote:

comportamento non definito?? what's this ?
ad ogni modo un long int e' qualcosa come (su architetture a 32bit) 4Mil 
max. e a quando mi giunge alle mente 4mil so circa 000 000 000 ... 9 + 1 = 
10 cifre max... dunque 40+1, piu' che suff.... 
o intendevi altro ?


Luc wrote:

no, non sono incubi e' la realta'... mera stupida realta'.
Lore


Sě, intendevo altro. Sebbene i letterali stringa siano assegnabili a
puntatori di tipo char*, non puoi sovrascriverli. Ad esempio, il seguente
codice produce undefined behaviour:
    char* e = "pippo";
    e[0] = 'p';
Sulla mia piattaforma e con il mio compilatore, il codice precedente
genera un segmentation fault, ma in altri ambienti potrebbe non produrre
nulla di immediatamente visibile.
Se anche tu avessi usato un array di caratteri, inizializato in questo
modo:
   char str[] = "????? ";
 
non avresti potuto comunque usare strcat come hai fatto nel codice sopra.
Ad ogni modo, non č consigliabile in C++ (ma nemmeno in C, a dire il vero)  
gestire le stringhe come array di caratteri null-terminated. In C++ esiste
std::string. (Spero che l'autore del post originario stia leggendo.)
Per inciso, std::string::append č instrisecamente piů efficiente di
strcat.
Max

Devi usare la "sprintf".
Es:
int main()
{
    char stringa[256];
//Dichiaro la stringa
    sprintf(stringa,"Ecco qua' il numero: %d",Numero);            //Formatto
la stringa con la sprintf
    printf(stringa);
//Stampo la stringa a video
}

 bel terminale xterm:)
Scrivevo gią in C/C++ sotto Linux, ma preferisco divertirmi con Microsoft
Visual C++ visto che penso che dovremo usarlo anche a scuola. Cmq non vedo
cosa cambi, basterebbe lavoraro in shell DOS con compilatori tipo Turbo C++
di Borland ecc... Solo che sarebbe migliore in quanto le librerie sono
quelle di Windows e dovendo poi usare quelle a scuola sarei gią pronto.


 quelle di Windows e dovendo poi usare quelle a scuola sarei già pronto.
Beata innocenza!
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

bel terminale xterm:)
Mi spieghi cosa c'entra la programmazione visuale in tutto ciň?
Lui sta semplicemente tentando di passare un long ad una funzione che
accetta un const char* e mi pare naturale che qualsiasi compilatore si
incazzi di fronte a tale tentativo.
Forse stai dicendo che la programmazione visuale porta ad un tale
livello di rincoglionimento da arrivare a commettere simili errori?
Io comunque do il consiglio di usare la stl ed in particolare le
std::string(due std::string possono essere concatenate usando un
semplice operatore di addizione)se si sta programmando in C++,
lasciando perdere queste funzioni da museo.
Il Ghenio
-----
ZIO : Fun and games are over with. Anyone who dares
get in my way shall perish.
DIO ci salvi dagli ocx del Viral Basic.
-----

 
hai ragione, correggo:
{
        char tmp_str[40+1];
        char *str = "????? ";
        char result_str[40+1];
        long int intero = xx;
 
        sprintf(tmp_str, "%ld", intero);
        strcpy(result_str, str);
        strcat(result_str, tmp_str);
 
        // ora result_str = "????? xx"
}
anche se personalmente preferisco:
{
        char tmp_str[40+1];
        char *str = "????? ";
        long int intero = xx;
 
        sprintf(tmp_str, "%s %ld", str, intero);
        // ora tmp_str = "????? xx"
}
dove in questo caso la regione di memoria usata per lo storage e' la 
tmp_str, nella quale ci sono 40+1 bytes in lettura/scrittura.


 Beata innocenza!
Sarebbe a dire?



Guarda, scusa se sono incapace, ma questo è quello che ho scritto:

 > }
Scusa, il messaggio è stato spedito incompleto...
Questo è quello che ho scritto:
sprintf(report, ("%s\nPorta %ld aperta", m_report, contatore));
report è un vettore, m_report è una variabile stringa associato ad un
controllo (più precisamente ad una textbox) e contatore è il solito long.
Questo è quello che mi dice il compilatore:

 > > }
Arridaičččč, la forza di OE :-))
Spero che sia l'ultimo :-((
Questo č quello che ho scritto:
sprintf(report, ("%s\nPorta %ld aperta", m_report, contatore));
report č un vettore, m_report č una variabile stringa associato ad un
controllo (piů precisamente ad una textbox) e contatore č il solito long.
Questo č quello che mi dice il compilatore:
error C2664: 'sprintf' : cannot convert parameter 2 from 'long' to 'const
char *'
        Conversion from integral type to pointer type requires
reinterpret_cast, C-style cast or function-style cast
Che posso fare?


std::string(due std::string possono essere concatenate usando un
domanda forse idiota: ma std::string fa parte della STL?
si, lo so che fa parte della lib standard, però volevo sapere se fa
parte anche di quel sotto-insieme di essa chi si definisce comunemente
STL (anche se non è totalemente corretto).
Anto
--
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 STL (anche se non è totalemente corretto).
Si. std::string e' una specializzazione di std::basic_string che fa parte della
STL.
Perche' dici che dire STL non e' totalmente corretto?


 Sarebbe a dire?
Sarebbe a dire che non esiste piu' una shell DOS ma semmai una modalità console
(non e' la stessa cosa) e che se intendi usare questa, allora tanto vale che ti
limiti alle librerie standard. Se invece vuoi usare le librerie di Windows e
creare roba tipo quella che si creava con le librerie GUI del turbo C++ dell'era
DOS, allora scoprirai che se per imparare a gestire come esperto quelle librerie
ti serviva si e no un mesetto d'esperienza, sotto windows non raggiungi quel
livello neppure dopo tre anni!



Ripassati l'operatore virgola. Quello che hai scritto equivale a qualche cosa
come:
"%s\nPorta %ld aperta";
m_report;
sprintf(report, contatore);
e' ovvio che il compilatore si arrabbia perche' contatore non e' una stringa!


STL (anche se non è totalemente corretto).
Fa parte della STL ed é una specializzazione della classe template
std::basic_string.
typedef basic_string<char> string;


livello neppure dopo tre anni!
Perché?


 Perché?
Perche' in un mese delle librerie grafiche semplici come quelle te le rivolti
come un guanto. Per rivoltarti come un guanto tutte le librerie Windows ci
vogliono altro che 3 anni!


 vogliono altro che 3 anni!
Non capisco: questo vuol dire che le librerie di Windows sono piu' o
meno rivoltanti? ;-)
Ciao,
Nicola

 STL (anche se non è totalemente corretto).
No, std::string non fa parte dell'STL, anche se la sua interfaccia e'
stata STL-izzata con l'aggiunta di iteratori, ecc.
Per gli altri (e per la precisione): STL e' una libreria sviluppata
originariamente da Stepanov e Lee presso l'HP (St-L ?), poi inclusa
quasi interamente nella libreria standard. L'STL contiene
sostanzialmente la parte della libreria standard concernente
Contenitori, Iteratori ed Algoritmi. La confusione deriva
presumibilmente dal nome *Standard* Template Library, ma la libreria si
chiamava gia' cosi' prima di entrare a far parte dello standard vero e
proprio.
Ciao,
Nicola

Perche' dici che dire STL non e' totalmente corretto?
perché, a quanto ne so, STL è il nome di un progetto sé stante (creato
da Stepanov, se non sbaglio). Parte della libreria std del C++ ha
preso spunto dalla STL, ma non sono la stessa cosa: in un futuro il
team di sviluppo di STL potrebbe anche decidere di cambiare la
strutturazione della liberia, mentre quella std resterà inalterata
(almeno sino alla prossima versione dello standard).


 vogliono altro che 3 anni!
si, ma ad imparare a fare cose semplici (quello che riesci a vare
con quella lib. grafica) sotto winzozz non richiede 3 anni od
oltre... :-)
--
ciao
xaero

 (almeno sino alla prossima versione dello standard).
La STL e' stata scelta fra una serie di proposte diverse. Ma la S sta proprio
per Standard. IMHO la STL e', per definizione, quella parte della SCL composta
da template ed e' definita dal documento di standardizzazione del C++.
Indipendetemente dalle idee che l'hanno originata.


 wrote in message
news:3B3C3B62...@divalsim.it...

Vuole dire che sono sicuramente molto ma molto piu' vaste e molto ma molto piu'
complesse. Se questo e' o meno rivoltante suppongo che dipenda dai gusti
personali.
Per me il concetto stesso di interfacciarsi con l'utente e' rivoltante :-) Anzi:
l'utente e' rivoltante ;-) Pero' purtroppo e' difficile farne a meno :~{


 oltre... :-)
Con quelle librerie, ai loro tempi, riuscivo a fare animazioni grafiche in tempo
reale su un "semplice" 486dx4 con SVGA non accelerata che oggi farei fatica a
fare con un PIII 700MHz + Matrox sotto Win2K a meno di non ricorrere a OpenGL o
DirectX.
E il bello e' che nel vecchi sistema la rappresentazione dei dati la potevo fare
come volevo, se usi OpenGL o DirectX praticamente sei forzato a usare la loro
rappresentazione oppure a trasformare tutto il mondo dalla tua alla loro per
ogni frame (impensabile nel 99% dei casi).


 wrote in message
news:3B3C3CBB...@divalsim.it...

Si. Ma allora anche gli streams non farebbero parte della STL. E lo stesso altre
piccolezze rese sotto forma di template. Eppure ad oggi con STL si includono
anche questi. Di piu': l'ultimo libro di Scott Meyers titola STL ma parla
praticamente di tutta la CSL!


 per Standard. IMHO la STL e', per definizione, quella parte della SCL composta
oops! Ovviamente intendevo la CSL (C++ Standard Library) non la SCL (Standard C
Library) che ne e' semmai un'altro subset!


 Indipendetemente dalle idee che l'hanno originata.
Veramente anch'io sapevo che Standard C++ Library e STL sono due
progetti differenti che si evolvono indipendentemente l'uno dall'altro.
Ne parlava, in questi termini, molto tempo fa Alex Martelli.
EMG

EMG
Ciao
Marco Barisione (ICQ 84277092)

 l'utente e' rivoltante ;-) Pero' purtroppo e' difficile farne a meno :~{
"Gli utenti sono il flagello dell'informatico"
Ciao,
Nicola

 di tutta la CSL!
E sbaglia. Io questa distinzione l'ho sentita tanto da B. Stroustrup
quanto da A. Koenig.
Ciao,
Nicola

 quanto da A. Koenig.
A proposito di STL e di libri: mi sembra di ricordare un vecchissimo post
di Alex Martelli in cui lui raccontava di aver evitato all'ultimo momento
che Eckel lasciasse quella stessa imprecisione nella 2a edizione del TIC.
Max

 "Gli utenti sono il flagello dell'informatico"
Io li vedo più come "La gioia e il dolore dell'informatico". :-)
EMG


Mi vien da pensare che per te chi usa, paga. Nel mio caso essendo
lavoratore dipendente, di solito impegnato presso aziende di una certa
dimensione, il giro tramite il quale si passa da chi usa il mio software
a chi firma l'assegno alla fine del mese e' piuttosto lungo. E potendo
scegliere quali anelli tagliare... :-)
Ciao,
Nicola

 Mi vien da pensare che per te chi usa, paga.
Esattamente. :-)
EMG

da template ed e' definita dal documento di standardizzazione del C++.
La STL e la libreria standard sono due cose diverse.
Oggi la STL credo sia portata avanti da Silicon Graphics.
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>