As vezes, durante a construção de um programa em particular, precisamos converter o valor contido em uma variável para uma variável de outro tipo.
Pode ser de nosso interesse, por exemplo, fazer a divisão de uma variável do tipo inteiro soma
por 777. Ao fazermos isso da forma convencional (soma/777
) o compilador tratará tal instrução como uma divisão de inteiros, ou seja, o nosso resultado será um inteiro e qualquer casa decimal após a parte inteira será perdida (truncada). Por exemplo:
int soma = 516;
cout << "Temos como resultado: " << soma/777 << endl;
Embora esperássemos o resultado 0,66
, apenas a parte inteira será enviada para saída ou seja, teremos 0
como resposta.
Para tratar tais situações, o C++ nos permite aplicar conversões. Podemos, por exemplo, utilizar o principio de que: uma variável do tipo double
possui mais precisão do que uma variável do tipo int
, logo podemos atribuir um int
a um double
sem perda de informação. Logo:
int soma = 516;
double temp = soma;
cout << "Temos como resultado: " << temp/777 << endl;
nos dará o resultado esperado.
O C++ também dispõe da instrução static_cast
e do operador de molde para aplicarmos tais conversões. Na primeira forma, usamos a sintaxe static_cast
seguida do tipo ao qual queremos converter entre '<'
e '>'
, em seguida o valor a ser convertido. O operador de molde consiste em escrever o nome do tipo desejado e, em seguida o valor a ser convertido entre parênteses. Portanto, obtemos os mesmos resultados com as instruções:
int soma = 526;
cout << "Temos como resultado: " << static_cast<double>(soma)/777 << endl;
ou
int soma = 526;
cout << "Temos como resultado: " << double(soma)/777 << endl;
Obs: Quando o nome do tipo desejado contém um espaço em branco, devemos usa parênteses no tipo seguido do valor, como por exemplo:
int x = 65;
cout << (unsigned char)x; // imprime A
Note que, os modos apresentados acima também podem ser utilizados para converter uma variável de maior precisão em uma de menor precisão. Como é de se esperar, ao fazermos isso termos perda de dados como no primeiro caso apresentado.
Quando trabalhamos com char
em C++ precisamos levar em conta o fato de que: cada caractere é codificado no C++ em ASCII. Sendo assim podemos fazer a conversão de um tipo char
para um int
ou vice-versa. Por exemplo:
char exclamation = '!';
int temp = exclamation;
ao verificarmos o valor da variável temp
encontramos 33 que é justamente a codificação em ASCII para a '!'
.
Agora que já sabemos o básico sobre conversões entre tipos no C++, o leitor deve ter notado que isso não resolve todos os nossos problemas.
As conversões que mostramos ate aqui dizem respeito aos chamados tipos básicos como int
, double
e char
.
Suponha que nos queremos converter o inteiro 86 para sua representação textual. Uma variável do tipo char não nos seria util já que, se colocassemos esse valor em uma variavel char
obteríamos como resultado o caractere ASCII de código 86, a saber 'V'
.
Uma string
nos seria mais adequado, pois assim poderíamos converter o valor 86 para "86" ou ainda, levando em conta que uma string
é um array de caracteres, teríamos um array com '8'
e '6'
(lembrando quem uma string em C++ termina com o caractere de fim de string '\0'
).
Para aplicarmos a idéia sugerida anteriormente faremos uso da classe stringstream
da biblioteca sstream
.
Primeiramente precisamos incluir a biblioteca a ser utilizada.
#include <iostream>
using std::cout;
using std::endl;
#include <sstream>
using std::stringstream;
#include <string>
using std::string;
Agora podemos criar nossos objetos stringstream
. Criaremos um objeto chamado ss
, com capacidade tanto de entrada com de saída de valores. Para isso usamos os parâmetros stringstream::in
e stringstream::out
no construtor do nosso objeto para habilita-lo para entrada e saída, respectivamente.
stringstream ss (stringstream::in | stringstream::out);
Agora que temos nosso objeto, usaremos o operador de entrada de fluxo para adicionar a string desejada. Temos:
ss << "120 42 377 6 5 2000";
Temos agora um objeto stringstream
que possui nossa string
com diversos números. Vamos fazer a conversão desses números, armazena-los numa variável e manda-los para a saída. Para isso, usamos o operador de saída de fluxo. Tal operador sobrecarregado se adequa e manda para a variável alvo um dado do tipo dessa variável. Por exemplo:
int x;
while( ss >> x )
cout << x << " ";
cout << endl;
Fazendo isso, mandaremos os dados armazenados na string
contida no objeto ss
para uma variável do tipo int
.
Você notará também que, à medida que as valores vão sendo jogados em x
, o objeto trata de mandar o a partir do ponto onde parou ignorando os espaços.
Agora que sabemos como converter de um string
para um variável numérica vamos fazer o sentido contrario.
Vamos criar um outro objeto camado sout
para podemos acrescentar um valor a ele, pois caso isso seja feito no objeto ss
o novo valor será concatenado aos valores já presentes.
stringstream sout (stringstream::in | stringstream::out);
Agora, podemos atribuir um valor ao objeto sout
, em seguida recuperar esse valor em forma de string
pelo método str
do objeto stringstream
desta forma:
sout << 120;
cout << “O valor contido na string eh: “ << sout.str() << endl;
Poderíamos também, usar o operador de saída de fluxo de forma a jogar o conteúdo de sout
em uma string
desta forma:
string value;
sout >> value;
cout << “O valor contido na variável value eh: “ << value << endl;
Bem, acho que agora sabemos o suficiente sobre conversões de variáveis.
Referencias: http://www.cplusplus.com
Anexo
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main ()
{
int soma = 516;
cout << "Temos como resultado: " << soma/777 << endl;
int soma2 = 516;
double temp = soma2;
cout << "Temos como resultado: " << temp/777 << endl;
int soma3 = 526;
cout << "Temos como resultado: " << static_cast<double>(soma3)/777 << endl;
cout << "Temos como resultado: " << double(soma3)/777 << endl;
char exclamation = '!';
int temp2 = exclamation;
cout << "O código ASCII do caractere '!' eh: " << temp2 << endl;
stringstream ss (stringstream::in | stringstream::out);
ss << "120 42 377 6 5 2000";
int x;
while( ss >> x )
cout << x << " ";
cout << endl;
stringstream sout (stringstream::in | stringstream::out);
sout << 120;
cout << "O valor contido na string eh: " << sout.str() << endl;
string value;
sout >> value;
cout << "O valor contido na variável value eh: " << value << endl;
return 0;
}