View Full Version : [c++] Da Stringa a ASCII
Goten_ssj
03-10-2006, 19:03
il problema è semplice..
devo fare un programma in c++ che data una stringa mi restituisca il codice ascii della stringa inserita...
ad esempio inserisco "ciao" e mi restituisce ttt il codice ASCII in fila per ogni lettera...
nn so se mi sn fatto capire...
il problema è semplice..
devo fare un programma in c++ che data una stringa mi restituisca il codice ascii della stringa inserita...
ad esempio inserisco "ciao" e mi restituisce ttt il codice ASCII in fila per ogni lettera...
nn so se mi sn fatto capire...
leggi un bytes alla volta e fai:
per decimale usi atoi();
per esadecimale usi sprintf(hex, "%02x" stringa & 0xff);
ciao
Goten_ssj
03-10-2006, 19:39
e se sono lettere??
cioè..se uno immette "ho 2 gatti"
mi dovrebbe restituire l'ascii del carattere h + o + spazio + 2 + spazio + g + a + t + t + i tutto attaccato...
io ci ho provato ma non so proprio come fare... :(
#include <iostream>
#include <string>
#include <iomanip>
int main(void)
{
std::string esempio = "Ho 2 gatti";
std::cout.fill('0');
for (size_t i = 0; i != esempio.length(); ++i)
std::cout << std::hex << std::setw(2)
<< static_cast<int>(esempio[i]);
std::cout << std::endl;
}
Non si deve usare atoi(), perché essa fa una conversione da un numero contenuto in una stringa a un valore numerico (es. "12" -> 12).
Il valore contenuto in un char è già di per sé il codice ASCII del carattere!
string s = "ho 2 gatti";
for (int i=0; i<s.length(); i++)
cout << (int) s.at (i) << " ";
cout << endl;
facendo il cast ad int, stampo il valore numerico del carattere, che è il suo codice ASCII.
Goten_ssj
03-10-2006, 20:22
mi ero dimenticato di dire che io lavoro con il C++ Builder della Borland e quindi in ambiente visuale...
nn ho mai usato il comando cout e non so se funzioni in visuale...me lo spiegate?
Goten_ssj
03-10-2006, 20:29
#include <iostream>
#include <string>
#include <iomanip>
int main(void)
{
std::string esempio = "Ho 2 gatti";
std::cout.fill('0');
for (size_t i = 0; i != esempio.length(); ++i)
std::cout << std::hex << std::setw(2)
<< static_cast<int>(esempio[i]);
std::cout << std::endl;
}
ok...questo codice non mi dà errori...adesso il problema è capirlo e inserirlo nel mio bottone :P
Goten_ssj
03-10-2006, 20:32
non capisco:
std::
cout
cout.fill
<<
size_t
static_cast
end1
scusate, ma sono davvero niubbo in questo linguaggio e non vorrei disturbarvi troppo però se mi aiutate magari raggiungo i vostri livelli...e soprattutto desidererei capire come avete imparato e dove avete accresciuto le vostre conoscenze? :(
ringrazio ttt...
Goten_ssj
04-10-2006, 09:42
lo so che è sempre difficile aiutare i niubbi xò nn penso sia così lungo da spiegare.. :Prrr:
non capisco:
std::
cout
cout.fill
<<
size_t
static_cast
end1std è un "namespace" entro cui sono dichiarate certe classi della libreria del C++.
Si può fare std::string oppure mettere using namespace std; all'inizio e poi usare semplicemente string.
cout è un oggetto di classe ostream, serve per scrivere sullo standard-output.
cout.fill è un metodo che imposta il carattere di riempimento quando si usa width() e il numero da scrivere è più piccolo.
<< è un operatore, di cui è stato fatto l'overload per poter scrivere vari tipi di dati su uno stream.
size_t è il tipo di dato che viene normalmente restituito da sizeof(). Vedilo come un tipo "intero".
static_cast serve per fare un cast "particolare". I dettagli però non me li ricordo. :rolleyes:
endl (non end1!) indica il newline. cout << endl, scrive un newline sullo standard-output.
Goten_ssj
04-10-2006, 11:10
quindi cout e end1 nel c++ visuale non mi servono vero?
il problema e come tradurli nel visuale ora.. :P
Non si deve usare atoi(), perché essa fa una conversione da un numero contenuto in una stringa a un valore numerico (es. "12" -> 12).
Il valore contenuto in un char è già di per sé il codice ASCII del carattere!
string s = "ho 2 gatti";
for (int i=0; i<s.length(); i++)
cout << (int) s.at (i) << " ";
cout << endl;
facendo il cast ad int, stampo il valore numerico del carattere, che è il suo codice ASCII.
si giusto... ho scritto di getto. Intendo:
sprintf (decimale, "%d ", stringa & 0xff);
ho fatto copia incolla dal mio code e mi sono impappinato:
if(atoi(decimale)<32)
strcat (ok, ".");
Goten_ssj
04-10-2006, 11:31
uhm..non ci sto capendo... :(
potete mettere pure i commenti? grazie mille :P
E' giusto quello che dice andbin...se la stringa è un vettore di caratteri invece fai così (stessa logica di quello di andbin):
for(int i = 0; i < strlen(s); ++i)
cout << (int)s[i] << " ";
Goten_ssj, andbin e okay: avete la firma irregolare http://www.hwupgrade.it/forum/regolamento.php ;)
Goten_ssj
04-10-2006, 19:09
si..ma il cout in visuale come lo traduco???
Intanto ringrazio okay e andbin per aver modificato la firma...ora manchi solo tu, Goten_ssj ;)
Per avere la stringa da stampare nella tua textbox fai così:
ostringstream ost;
for(int i = 0; i < strlen(s); ++i)
ost << (int)s[i] << " ";
E dopo devi immettere nella textbox ost.str(); che appunto ritorna la stringa completa...
Goten_ssj
09-10-2006, 16:01
l'unica cosa che sono riuscito a fare per adesso è quella di tradurre 1 solo carattere e mi viene così
char *x;
int a;
x=Input->Text.c_str();
a=int(x[0]);
Output->Text=a;
dove:
Input = Textbox di input
Output = Textbox di output
praticamente questo codice inserito 1 qualsiasi carattere nella textbox di input, restituisce la sua sequenza in ascii..
ecco...ora devo farlo per 1 intera stringa...
ostringstream ost;
for(int i = 0; i < strlen(s); ++i)
ost << (int)Input->Text[i] << " ";
Output->Text=ost.str();
Dovrebbe andare...
Goten_ssj
09-10-2006, 16:09
dice:
Undefined symbol 'ostringstream'
Credo che la prima cosa che debba saper fare un programmatore è non arrendersi alla prima difficoltà...quindi credo che tu debba essere in grado di trovare quale libreria includere da solo ;)
Goten_ssj
09-10-2006, 16:25
lol...il problema che non ho mai utilizzato librerie io..sono 1 superniubbetto alle prime armi...cmq adesso cerkerò :P
Goten_ssj
09-10-2006, 16:27
il mio help mi dice:
Synopsis
#include <sstream>
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<void> >
class basic_ostringstream
: public basic_ostream<charT, traits>
Goten_ssj
09-10-2006, 16:30
non mi hanno ancora spiegato come includere le librerie...
io dell'header (.h) non so praticamente ancora niente T_T
il mio help mi dice:
Vedi...l'help ti dice già la libreria da includere :)
Goten_ssj
09-10-2006, 16:37
si, ma...
io l'ho messa nel .cpp e nn funziona...
se gentilmente mi spiegassi anche come includere 1 libreria (cosa che tra l'altro penso sia basilare per i programmatori, te ne sarò immensamente grato) ;)
Dovrebbe funzionare semplicemente aggiungendo la riga #include <sstream> in cima al file .cpp dove usi il ostringstream... Che compilatore usi ?
Goten_ssj
09-10-2006, 16:45
Borland C++ Builder 6
Allora dovrebbe funzionare così come ti ho detto...
Al limite sotto a tutti gli include metti:
using namespace std;
Goten_ssj
09-10-2006, 17:15
cioè?
come?
Goten_ssj
09-10-2006, 17:17
ok, adesso va...
mi dà errore alla linea:
Output->Text=ost.str();
Cannot convert string to AnsiString..
forse se faccio
Output->Text=ost.AnsiString();
dici che va?
Goten_ssj
09-10-2006, 17:17
no..
così dice:
AnsiString is not a member of 'ostringstream'
quindi che si fa? T_T
Mea culpa, credevo che Text fosse una string invece è un AnsiString che è un tipo proprietario del C++ Builder...fai così:
Output->Text=ost.str().c_str();
ost.str() ritorna una classe string e quindi va applicato c_str() per ottenere il vettore di char...
Goten_ssj
09-10-2006, 17:38
mi dà 1 errore nella compilazione nel dstring.h
a questa riga
ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??
che cavolo vuol dire?? uff..nn lo finirò mai sto programma se nn c capisco nulla T_T
Dovrebbe essere un check per non far superare il limte delle dimensioni imposte nella editbox... Che errore ti ha dato ?
Goten_ssj
09-10-2006, 18:23
quando lo runno il programma parte senza errori, ma quando premo il bottone che contiene il codice..
Se metti una stringa composta da una sola o da due lettere hai lo stesso errore ?
Goten_ssj
09-10-2006, 18:49
si... :muro:
Se metti una stringa composta da una sola o da due lettere hai lo stesso errore ?
ma non poteva fare semplicemente:
sprintf (decimale, "%d ", stringa[i] & 0xff);
cout << atoi(decimale) << endl;
Goten_ssj
09-10-2006, 18:57
allora...primo, la stringa di input può essere formata sia da caratteri alfabetici che da numeri quindi atoi non penso vada bene..
secondo, lavoro in visuale quindi cout e srpintf e roba simile non ce l'ho..
sì che ce l'hai sprintf...non puoi usare printf e le altre, ma sprintf sì...
In ogni caso atoi converte una stringa intero, cioè va a prendere l'intero rappresentato nella stringa...al contrario a lui serve la lista dei codici ascii che compongono la stringa...
Allora hai lo stesso errore anche con una stringa corta ?
Goten_ssj
09-10-2006, 19:03
siiii T_T
allora...primo, la stringa di input può essere formata sia da caratteri alfabetici che da numeri quindi atoi non penso vada bene..
secondo, lavoro in visuale quindi cout e srpintf e roba simile non ce l'ho..
allora così:
sprintf (hexcode, "%01X ", stringa[i] & 0xff);// 0xff);//255
e poi lo converti in ascii
Goten_ssj
09-10-2006, 19:22
uff...adesso nn c capisco niente cn sto codice... T_T
Goten_ssj
09-10-2006, 19:25
char *x;
x=Input->Text.c_str();
int i;
sprintf (hexcode, "%01X ", x[i] & 0xff);
così mi dice:
Undefined symbol 'hexcode'
char *x;
x=Input->Text.c_str();
int i;
sprintf (hexcode, "%01X ", x[i] & 0xff);
così mi dice:
Undefined symbol 'hexcode'
dichiaralo globale ti stampa in esadecimale:
char hexcode[10];
Così dovrebbe funzionare al 100% ;)
ostringstream oss;
for(int i = 0; i < Input->Text.Length(); ++i)
oss << (int)Input->Text.c_str()[i] << " ";
Output->Text = oss.str().c_str();
Il problema era nella linea indicata di rosso, AnsiString non ha un metodo che ritorna un normale char...mi sono adattato con questa conversione...
Goten_ssj
09-10-2006, 19:31
Così dovrebbe funzionare al 100% ;)
ostringstream oss;
for(int i = 0; i < Input->Text.Length(); ++i)
oss << (int)Input->Text.c_str()[i] << " ";
Output->Text = oss.str().c_str();
Il problema era nella linea indicata di rosso, AnsiString non ha un metodo che ritorna un normale char...mi sono adattato con questa conversione...
ti adoro ^_^
ti adoro ^_^
invece così in ascii:
sprintf (hexcode, "%d ", int(stringa[i]) & 0xff);
solo una riga di code
Goten_ssj
09-10-2006, 19:36
allora... nella linea rossa:
la parte iniziale è la variabile
oss
dopo oss ci stanno i << che non ho ben capito a cosa servano ma diciamo che dovrebbe essere 1 specie di assegnazione
dopo i << ci stà:
(int)Input->Text.c_str()[i]
che praticamente trasforma in ascii il carattere presente nella cella di memoria che stiamo esaminando (che cambia ogni volta con il ciclo, aggiungendo +1 all'indicatore variabile "i")
dopo (int)Input->Text.c_str()[i] ci stànno nuovamente i <<
che non ho capito cosa facciano
e dopo i << ci sta " ";
che se non ho capito male inserisce tra ogni carattere codificato uno spazio...
ecco...dimmi tu se ho capito più o meno bene ttt....
solo una riga di code
Ma così stampi un solo carattere nella stringa...sopra li stampo tutti...
Goten_ssj: hai capito bene... << è un operatore che si usa sugli stream... In pratica "butta" quei caratteri nello ostringstram...
Input->Text ritorna una AnsiString
Input->Text.c_str() ritorna una stringa C, cioè un char *
Input->Text.c_str()[i] riotrna l'i-esimo char della stringa
(int)Input->Text.c_str()[i] converte il char in intero (i char in C e C++ sono di fatto interi che variano fra -128 e +127, che appunto corrispondono al codice ASCII del carattere)
Goten_ssj
09-10-2006, 19:55
codice finale del programma:
char *x;
x=Input->Text.c_str();
ostringstream oss;
for(int i=0; i<strlen(x); i++)
{
oss << (int)x[i] << " ";
}
Output->Text=oss.str().c_str();
semplice no? :D
ma oss posso chiamarlo pure in altro modo vero? essendo una variabile.. ;)
Goten_ssj
10-10-2006, 17:09
spero di poter continuare all'interno di questa discussione...
se volessi tradurre da intero a esadecimale ci sarebbe un comando?
avevo trovato una sorta di IntToHex ma dovrei includere un file .pas e non ho la minima idea di come fare...
se nn sbaglio l'estensione .pas si riferisce alle librerie del pascal..vero?
attendo qualche notizia :P
Guarda l'help di AnsiString, c'è un metodo chiamato format...e dovrebbe funzionare come la sprintf e quindi con %x dovrebbe stampare in esadecimale...
In alternativa, sfruttando il C++ standard, dovresti includere iomanip, e poi usare lo ostringstream di prima e formattare la stringa in questo modo:
oss << hex << intero;
Goten_ssj
10-10-2006, 17:37
cioè?
mettiamo caso che io voglia fare 1 programmino cm quello di prima, xò avere l'esadecimale al posto che l'int come faccio?
ostringstream oss;
for(int i = 0; i < Edit1->Text.Length(); ++i)
oss << hex << (int)Edit1->Text.c_str()[i] << " ";
Edit2->Text = oss.str().c_str();
In pratica stampi l'esadecimale corrispondente ad ogni carattere...
Goten_ssj
10-10-2006, 20:32
devo includere anche un'altra libreria vero?
No, non sembra...credevo che servisse iomanip, ma non serve...
Ora chi mi da uno spunto per tradurre quei caratteri in ascii inseriti all'interno di una stringa in c++?
#include <iostream>
#include <string>
int main() {
std::string input;
std::cout << "Inserisci una stringa: ";
std::getline(std::cin, input);
std::cout << "Codice ASCII per ogni carattere:" << std::endl;
for (char c : input) {
std::cout << static_cast<int>(c) << " ";
}
std::cout << std::endl;
return 0;
}
Ora chi mi da uno spunto per tradurre quei caratteri in ascii inseriti all'interno di una stringa in c++?
#include <iostream>
#include <string>
int main() {
std::string input;
std::cout << "Inserisci una stringa: ";
std::getline(std::cin, input);
std::cout << "Codice ASCII per ogni carattere:" << std::endl;
for (unsigned char c : input) {
std::cout << static_cast<unsigned int>(c) << " ";
}
std::cout << std::endl;
return 0;
}
Inserisci una stringa: à,è,ì,ò,ù
Codice ASCII per ogni carattere:
195 160 44 195 168 44 195 172 44 195 178 44 195 185
Le lettere accentate fanno parte dell'ASCII esteso (8 bit) non quello "tradizionale" a 7 bit che permette la codifica di 128 caratteri.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.