Você está na página 1de 25

Programar em C++/Manipulando strings < Programar em C++ Programar em C++Entrada e sada de dados 2Classes ndice [esconder] 1 "Char strings"

e Strings 2 Funes de caracteres teis. 3 Strings em C++ 3.1 Exemplos de como manipular strings em C++ 4 Comparando formas de operar strings em C e C++ 4.1 Funes uteis para o uso de strings 4.2 Copiando strings 4.3 Unir strings 4.4 comparar frases 4.5 Convertendo C-string e nmero "Char strings" e Strings[editar | editar cdigo-fonte]

Os caracteres so entendidos como sendo nmeros que geralmente tm oito bits, esses nmeros so traduzidos na tabela ASCII de 128 caracteres, como existem inmeras regies no mundo com caractersticas lingusticas prprias, a tabela ASCII estendida por um bloco de caracteres acima dos 128 mais baixos que varia de acordo com as necessidades de cada lngua. A parte superior da tabela ASCII conhecida como parte estendida e referenciada por pginas de cdigos para cada propsito lingustico, isso quer dizer que podemos ter os mesmos nmeros significando caracteres diferentes para cada regio do mundo. No estilo da linguagem C quando queremos representar um conjunto de caracteres colocamos todos eles em uma matriz sequenciada na memria: Endereo relativo Dado U m 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A a f r a s e .

Por exemplo, para declarar um espao na memria que contenha 20 caracteres fazemos: char dados[20]; Este o estilo de strings usado pela linguagem C pura. Para manipular este tipo de string preciso ter certo cuidado, pois a matriz sempre tem um tamanho definido e caso faamos um acesso a um endereo fora da matriz invadiremos outras reas de memria que no temos como definir o que so, e

portanto poderemos fazer o programa parar de funcionar, em muitos sistemas pode tambm haver danos aos outros programas e at mesmo ao prprio sistema operacional, porm em sistemas operacionais mais sofisticados como o GNU/Linux, que possuem gerenciamento de memria com proteo de memria, apenas o programa que causou a falha ir parar de funcionar. Para manipular este tipo de string a biblioteca padro da linguagem C dispe de diversas funes, para mais detalhes consulte o livro Programar em C. No estilo C++, como era de se esperar, as strings so objetos, eles podem ser criados facilmente atravs da biblioteca padro referenciada pelo arquivo de cabealho <string>. As strings so objetos com recursos que permitem manipular os seus caracteres com as funcionalidades das funes da linguagem C e mais algumas caractersticas prprias possibilitadas pela orientao a objetos. // listandoCodigoASCII.cpp

#include<iostream> using std::cout; using std::cin;

using std::endl;

#include<string> using std::string; using std::getline;

int main(){ string anyWord;

cout << "Digite uma palavra: "; getline(cin, anyWord);

for ( int i = 0; i < anyWord.length(); i++) cout << anyWord[i] << " - " << (int)anyWord[i] << endl; cout << endl;

return 0;

} //end main Funes de caracteres teis.[editar | editar cdigo-fonte] As seguintes funes esto no cabealho da biblioteca <cctype> toupper() (to+upper) retorna a maiscula de uma letra. uma funo de um argumento o caractere. no caso do argumento no ser uma letra, a funo retorna o mesmo caractere que argumento. tolower() (to+lower) o mesmo comportamento que toupper(), porm com o resultado em minscula. #include <iostream> #include <cctype> using namespace std;

int main(void)

{ char ch; do { cout << "Pressionar S ou s para sair, \nqualquer outra tecla para continuar: "; cin.get(ch); ch = toupper(ch); if (ch != '\n') cin.ignore(); if (ch != 'S') cout << "Deseja continuar?\n"; else cout << "Saindo..."; } while (ch != 'S');

#ifdef WIN32 system ("pause");

#endif

return 0; } Funes que verificam o caractere. Estas funes recebem apenas um argumento, o caractere e retornam um valor booleano. Funo isalpha Descrio Retorna verdadeiro se o argumento uma letra do alfabeto; falso em caso contrrio.

isalnum Retorna verdadeiro se o argumento uma letra do alfabeto ou um dgito; falso em caso contrrio. isdigit islower Retorna verdadeiro se o argumento um dgito; falso em caso contrrio. Retorna verdadeiro se o argumento uma letra minscula, falso em caso contrrio.

isprint Retorna verdadeiro se o argumento um caractere imprimvel (inclundo espaos); falso em caso contrrio. ispunct Retorna verdadeiro se o argumento um sinal de pontuao (caracteres imprimveis que no sejam letras, dgitos ou espao); falso em caso contrrio.

isupper

Retorna verdadeiro se o argumento uma letra maiscula; falso em caso contrrio.

isspace Retorna verdadeiro se o argumento um espao, tabulao ou nova linha; falso em caso contrrio. Strings em C++[editar | editar cdigo-fonte] As cadeias de caracteres da linguagem C podem formatar um novo tipo de dados, porm criar tipos de dados mais sofisticados no possvel nesta linguagem, as strings em C++ so objetos da classe string, o que isso traz de novo para o tratamento de textos em programas? A primeira coisa a notar quando criamos strings em C++ a maneira de cri-las, a classe disponibiliza uma srie de construtores: 1 string ( ); 2 string ( const string& st ); 3 string ( const string& st, size_t position, size_t n = npositions ); 4 string ( const char * ps, size_t n ); 5 string ( const char * ps ); 6 string ( size_t n, char ch ); Isto torna possvel, basicamente, criar string de seis maneiras diferentes:

Podemos definir um objeto string vazio, para futuramente usarmos de acordo com a necessidade; Podemos criar um objeto string com uma cpia de outro; Podemos criar um objeto string com uma cpia de uma poro de outra string; Podemos criar um objeto string com uma cpia de uma parte de uma "char string"; Podemos criar um objeto string com uma cpia de uma "char string"; Podemos criar um objeto string preenchida com uma quantidade definida de um determinado caractere; Quando manipulamos strings, podemos faz-lo com operadores, como por exemplo "+", "+=", "<<", etc... Isto torna o cdigo um pouco mais intuitivo, vejamos os operadores: 1 operator= 2 operator[] 3 operator+= 4 operator+ 5 operator<< 6 operator>> Que representam as operaes:

Atribuir o valor de uma string para outra; Acessar caracteres individualmente; Adicionar uma string no final de outra; Concatenar strings; Enviar uma string a um output stream; Receber uma string do input stream. Apenas com estas poucas informaes j possvel operar strings com bastante flexibilidade e de uma maneira muito intuitiva, vejamos alguns exemplos: string a = "Alice e Beto gostam de ", b("chocolate."), c = string("doce de leite."), d = "pipoca.", e(c);

cout << a + b << endl; cout << a + c << endl; cout << a + d << endl; cout << a + e << endl; Estas operaes resultam em: Alice e Beto gostam de chocolate. Alice e Beto gostam de doce de leite. Alice e Beto gostam de pipoca. Alice e Beto gostam de doce de leite. Exemplos de como manipular strings em C++[editar | editar cdigo-fonte] erase A funo membro erase elimina parte de uma string. Os parmetros passados para a funo so a posio inicial e o nmero de caracteres a ser excludo. Veja um exemplo de uso abaixo: #include<iostream> using std::cout;

using std::endl; using std::cin;

#include<string> using std::string; using std::getline;

int main(){ string myText;

cout << "Digite um texto qualquer" << endl; getline( cin, myText ); myText.erase(7, 3);

cout << myText << endl;

return 0; } Comparando formas de operar strings em C e C++[editar | editar cdigo-fonte] Em C, temos diversas funes que so usadas para manipular strings, para mais detalhes veja o livro Programar em C, aqui faremos uma comparao dos modos de operar strings em C e C++, algumas particularidades da linguagem C++ permitem uma operao mais intuitiva das strings e algumas novas formas de trat-las. Vejamos como manipular estes dados to comuns em qualquer programa. Funes uteis para o uso de strings[editar | editar cdigo-fonte] strlen() (str=string + len=length)- aceita um argumento que pode ser um array (uma cadeia) de caracteres, um ponteiro (que aponta para um array de caracteres) ou uma string literal. retorna um nmero inteiro que representa o nmero de caracteres, no incluindo o caractere "null": int len; len = strlen("Jeff") // a extenso 4 char* stinkydog = "Dante"; len = strlen(stinkydog); // a extenso 5 char name[80] = "Devvie";

len = strlen(name); // a extenso 6 No c++ temos duas funes similares na classe string que so o lenght() e size(). Estas funes no tem argumentos pois reportam as informaes sobre o objeto a quem pertencem, ambas retornam um inteiro que representa o tamanho das strings: string s = "Jeff Kent"; cout << s.length(); // mostra: 9 cout << s.size(); // tambm mostra: 9

Copiando strings[editar | editar cdigo-fonte] Se tentssemos copiar strings desta maneira char* target = "Jeff Kent"; char src[80] = "Micaela"; target = src; O que acontecia que era a cpia do endereo de src para o ponteiro e no os caracteres que esto dentro da matriz.

No entanto existe a funo strcpy (estilo C) ela aceita dois argumentos, O primeiro para onde vai ser copiada e passado o ponteiro desse array (no pode ser uma string literal). O segundo a frase a ser copiada e pode ser um array, um ponteiro ou um string literal char* target = "Jeff Kent"; char src[80] = "Micaela"; strcpy(target, src); Note que esta operao muito arriscada visto que, quando criamos target, a quantidade de caracteres que foi reservada para a string era de 9 caracteres mais o caractere nulo no final, se fizermos uma cpia de uma string com mais de 9 caracteres para este endereo, representado por target, ele fatalmente causar uma violao de endereo. Porm em C++ podemos atribuir o valor de uma varivel para outra da classe string da forma: string target = "Jeff Kent"; string src = "Micaela";

target = src; Agora, reflitamos no que significa estas operaes: Em primeiro lugar "string" no um tipo primitivo de dado, uma classe, portanto um tipo de dado mais "inteligente", uma das caractersticas dos objetos string que eles so redimensionveis, ou seja, quando atribumos a uma string um dado maior que seu espao interno de armazenamento ela aumenta o seu espao interno para comportar o novo dado. Outra caracterstica que a operao "=" para a string uma operao de atribuio de contedo, de forma que a string copia a outra quando usamos este operador e no apenas o ponteiro que referncia o endereo da string. Unir strings[editar | editar cdigo-fonte] strcat() (string+concatenate) une duas frases. Recebe 2 argumentos, a frase primria o ponteiro para esse array. char target[80] = "Jeff"; char* source= " Kent"; strcat(target, source); cout << target; // Mostra "Jeff Kent"

Deve-se observar que strcat , potencialmente, uma das rotinas mais perigosas do C, por um motivo bem simples: a string de destino deve ser pre-dimensionada, e deve ter espao suficiente para receber a string de origem. Um pequeno programa como: char target[13] = "Regras do C!"; char* source = " Mas pode dar resultados imprevisiveis"; strcat(target, source); Escrever bytes em regies da memria que no foram previamente alocadas para a string. Em c++, este problema resolvido pelo uso de objetos string. Ao estilo de c++ podemos fazer. string target = "Regras do C++!\n"; string source = " Geralmente no do resultados imprevisiveis.\n"; target += source; cout << target; // // Mostra: Regras do C++! Geralmente no do resultados imprevisiveis.

Isto porque a classe string prev o uso do operador "+=" de concatenao e nele est embutido um cdigo de verificao de espao e realocao do mesmo para string, caso seja necessrio. comparar frases[editar | editar cdigo-fonte] se fizessemos char str1[80] = "Devvie Kent"; char str2[80] = "Devvie Kent"; if (str1 == str2) cout << "The two C-strings are equal"; else cout << "The two C-strings are not equal"; o que acontecia que estariamos a comparar os endereos e no os valores temos a funo strcmp (string+compare) (tem 2 arguentos. retornar 0 se forem iguais) char str1[80] = "Devvie Kent";

char str2[80] = "Devvie Kent"; if (!strcmp(str1, str2)) cout << "The two C-strings are equal"; else cout << "The two C-strings are not equal"; esta comparao pode ser resultar em negativo e positivo e isso tem a ver com o jogo de caracteres na tabela ascII. aqui vai um resumo Resultados de comparaes entre strings Primeira string (str1) Segunda string (str2) strcmp(str1, str2) Jeff jeff aZZZ negativo j tem valor ASCII maior que J Zaaa positivo a tem valor ASCII maior que Z Razo

chess check positivo Os primeiros trs caracteres so os mesmos, mas a quarta letra da primeira string-C, s, tem maior valor ASCII que a quarta letra da segunda string-C, c. Jeff Jeffrey negativo Os quatro primeiros caracteres so os mesmos, mas o quinto caractere da segunda string-C, r, tem valor ASCII maior que o caractere nulo na quinta posio da primeira string-C.

Em C++ podemos comparar duas strings atravs da funo membro da classe string: compare(), existem os seguintes formatos (assinaturas) para a funo: 1 int compare ( const string& str2 ) const; 2 int compare ( const char* szc ) const; 3 int compare ( size_t pos1, size_t n1, const string& str2 ) const; 4 int compare ( size_t pos1, size_t n1, const char* szc) const; 5 int compare ( size_t pos1, size_t n1, const string& str2, size_t pos2, size_t n2 ) const; 6 int compare ( size_t pos1, size_t n1, const char* szc, size_t n2) const; A funo permite os seguintes modos de operao, respectivamente: Comparar uma "string" de entrada (str2) com o contedo do objeto a qual ela pertence; Comparar uma "C-string" apontada por um ponteiro com o contedo do objeto a qual ela pertence; Comparar uma seo comeando em (pos1) do objeto, a qual contm (n1) caracteres, com a "string" de entrada (str2); Comparar uma "C-string" apontada por um ponteiro (szc), com uma seo comeando em (pos1), a qual contm (n1) caracteres do contedo do objeto a qual ela pertence;

Comparar uma seo do objeto, iniciada em (pos1) com (n1) caracteres, com uma seo de (str2), iniciada em (pos2) com (n2) caracteres; Comparar uma "C-string" apontada por um ponteiro (szc) de extenso (n2), com uma seo comeando em (pos1), a qual contm (n1) caracteres do contedo do objeto a qual ela pertence. O resultado similar ao da funo strcmp() em "C", retornando uma referncia de valor de acordo com o cdigo ASCII. Se estiver comparando duas strings uma outra opo, ainda mais natural, utilizar os operadores de comparao < e ==. using namespace std;

string str1 = "check"; string str2 = "chess"; if (str1 == str2) cout << "As palavras so iguais." << endl; else if (str1 < str2)

cout << "A palavra " << str1 << " vem antes de " << str2 << endl; else cout << "A palavra " << str1 << " vem depois de " << str2 << endl; Convertendo C-string e nmero[editar | editar cdigo-fonte] No ficheiro (arquivo) cabealho da biblioteca cstdlib (c+std+lib) temos vrias funes de converso de nmeros em tipo numrico. atoi (acrnimo para "ASCII to integer") recebe um argumento c-string) e retorna o inteiro que a c-string representa. No verifica se o argumento pode ser convertido: int num = atoi("7654"); Programa exemplo: #include <iostream> #include <cstdlib> // necessrio para atoi #include <cstring>

using namespace std;

int main(void) { char input[80]; int num; cout << "Enter an integer: "; cin >> input; for (int x = 0; x < strlen(input); x++) { if (x == 0) { if (!isdigit(input[x]) && input[x] != '-') return 1; } else

{ if (!isdigit(input[x])) return 2; } } num = atoi(input); cout << num;

#ifdef WIN32 system ("pause"); #endif

return 0; } Neste exemplo temos a vantagem de o usurio inserir um dgito para o array de caracteres em vez de um inteiro, para evitar um "run-time error" ou "garbage data" que aconteceria se a entrada fosse no

numrica. Depois o array verificado para ver se representa um nmero. Se o numero for negativo tem o caractere "".

Em C++ usamos objetos da classe stringstream (biblioteca sstream.h) para armazenar temporariamente os caracteres, depois usamos o operador ">>" para converter os caracteres em nmero, bastando para isto criar a varivel no formato que desejamos receber o nmero. Mais uma vez temos o uso do poliformismo para resoluo de um problema comum de programao, a operao do ">>" diferente para cada tipo de dado, selecionada automaticamente pelo compilador de acordo com o tipo de dado da varivel destino. string name = "123"; stringstream sst; int i; sst << name << endl; sst >> i;

Você também pode gostar