| Cuidado com a manipulação de strings |
| A experiência mostra que a primeira causa de corrupção
de memória retenção, GPF e outros problemas incômodos e difíceis de localizar
é a manipulação de strings. Nos velhos e difíceis tempos da linguagem C isso
era inevitável, agora, com C++, isso não precisa mais ser um problema. Se você puder, construa uma classe string. Você já usou strings em outras linguagens? Não é bem mais fácil? A punição por um erro não é um GPF em outro ponto do programa, "que ocorre em algumas instalações e não em outras". Em outras linguagens o seu código para a manipulação de string funciona ou não funciona! E você sabe imediatamente se funciona bem ou não. Você pode obter esse mesmo nível de confiança em manipulação de strings em C++ se usar um classe string. Há várias implementações possíveis de classe string. Stroustrup descreve uma implementação simples no capítulo 7, seção 11, de seu livro The C++ Programming Language, segunda edição. Sua empresa pode fazer sua própria implementação. Seja qual for a implementação que você usar, sua classe string deve ser capaz de mover dados para (input) e de (output) strings, concatenar, pesquisar e substituir, etc. sem que o programador de aplicação tenha que lidar com a aritmética dos pointers. Tal implementação deveria usar o sinal de soma (+) para a operação de concatenação. Se sua empresa não implementou uma classe string, você ainda pode ter muitos benefícios usando os strings C++ stream. Um string stream é um stream que escreve em um string ao invés de escrever em um arquivo. Você pode declará-lo sem definir um tamanho máximo, e manejá-lo adicionando strings. Por exemplo |
//***** Create nametag string ****** ostrstream ost; ost << "My name is " << ychFname; ost.put(0); //null terminate the string makenametag(ost.str()); //***** //Also create a nametag with the last name after first //***** ost.seekp(ost.tellp()-1); //get rid of the null termination ost << " " << ychLname; ost.put(0); //null terminate the string makenametag(ost.str()); |
| Mesmo que você não use uma classe string, há vários modos de se manejar, inteligentemente, os strings terminados em zero. O exemplo seguinte não é uma das maneiras inteligentes. |
| char *pchPerson = "Magdelena
Alexandra de la Romero"; char ychName[20]; strcpy(ychName, pchPerson); //CRUNCH! cout << ychName << '\n'; //what this will output is anybody's guess. |
| Agora veja um manejo mais inteligente de string terminado em zero, usando strcpy. |
| char *pchPerson = "Magdalena
Alexandra de la Romero"; char ychName[20]; strncpy(ychName, pchPerson, sizeof(ychName)-1); ychName[sizeof(ychName)-1] = '\0'; cout << ychName << '\n'; //Magdelena Alexandra |
| Aqui uma outra solução, que também não corrompe memória. |
char *pchPerson = "Magdalena Alexandra de la Romero"; char pchName = new char[strlen(pchPerson) + 1]; strcpy(pchName, pchPerson); cout << ychName << '\n'; //Magdelena Alexandra de la Romero //***
//Of course, sooner or later pchName must be deleted
//***
if(pchName)
{
delete(pchName)
pchName = 0;
}
|
| | Home | Bookmarks | Universidades | Para Saber mais | Universidades | WEB Directory | Mapa do site | | |