PDA

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...

okay
03-10-2006, 19:35
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... :(

Qu@ker
03-10-2006, 20:18
#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;
}

andbin
03-10-2006, 20:20
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:

andbin
04-10-2006, 10:03
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

okay
04-10-2006, 11:28
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

cionci
04-10-2006, 18:50
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???

cionci
05-10-2006, 08:00
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...

cionci
09-10-2006, 16:05
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'

cionci
09-10-2006, 16:23
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

cionci
09-10-2006, 16:33
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) ;)

cionci
09-10-2006, 16:40
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

cionci
09-10-2006, 17:01
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

cionci
09-10-2006, 17:33
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

cionci
09-10-2006, 18:18
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..

cionci
09-10-2006, 18:38
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:

okay
09-10-2006, 18:55
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..

cionci
09-10-2006, 19:02
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

okay
09-10-2006, 19:17
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'

okay
09-10-2006, 19:27
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];

cionci
09-10-2006, 19:28
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 ^_^

okay
09-10-2006, 19:36
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....

cionci
09-10-2006, 19:44
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.. ;)

cionci
09-10-2006, 19:57
Certo ;)

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

cionci
10-10-2006, 17:31
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?

cionci
10-10-2006, 20:30
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?

cionci
10-10-2006, 20:42
No, non sembra...credevo che servisse iomanip, ma non serve...

ansvver
05-03-2023, 07:24
Ora chi mi da uno spunto per tradurre quei caratteri in ascii inseriti all'interno di una stringa in c++?

misterx
06-07-2023, 18:50
#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;
}

misterx
08-07-2023, 13:09
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

redrose
17-07-2023, 16:50
Le lettere accentate fanno parte dell'ASCII esteso (8 bit) non quello "tradizionale" a 7 bit che permette la codifica di 128 caratteri.