Olá pessoal, tudo certo?!
Depois de uma pequena pausa, retorno a esta série sobre os fundamentos do C++.
Agora, apresento um pequeno resumo das funções do C++ para strings. Não pretendo apresentar uma lista exaustiva, apenas “apresento o caminho das pedras”.
Headers para funções que suportam strings
A biblioteca padrão provê um header, cstring, que contem funções para manipulação de strings terminadas em nulo. Este conjunto de funções fazem parte da especificação padrão do C++.
Há também alternativas para algumas dessas funções que não fazem parate do C++ padrão, mas que disponibilizam implementações mais seguras que as originais.
Determinando o tamanho de uma string terminada em nulo
Para obter o tamanho de uma string, armazenada em um char *, usamos a função strlen. A função wcslen tem o mesmo propósito para wchar_t*. Observe:
#includeusing std::cout; using std::endl; void main() { char* pstr = "Aqui temos uma string!"; cout << "A string '" << pstr << "' tem " << strlen(pstr) << " caracteres." << endl; }
Este código, quando executado, resulta em:
Tanto strlen() quanto wcslen() definem o tamanho da string procurando pelo caractere nulo no final (código ascii 0). Se não encontrar, a função irá “continuar pela memória”. Por essa razão, estas funções representam um risco de segurança quando estamos trabalhando com dados de uma fonte externa não confiável. Nesses casos, devemos usar strnlen() e wcsnlen() que requerem um segundo argumento com um limite. Observe:
#includeusing std::cout; using std::endl; void main() { char* pstr = "Aqui temos uma string!"; cout << "A string '" << pstr << "' tem " << strnlen(pstr, 50) << " caracteres." << endl; }
Concatenando strings terminadas em nulo
A função strcat() concatena duas strings terminadas em nulo. A string do segundo argumento é “adicionada” na string do primeiro argumento. Observe:
#includeusing std::cout; using std::endl; void main() { char s1[15] = "Elemar"; char* s2 = " Junior"; strcat(s1, s2); cout << s1 << endl; }
Perceba que a primeira string é armazenada em um array com 15 caracteres, que é maior que a string que estamos atribuindo (meu nome, no exemplo).
A string fornecida no primeiro argumento deverá ter espaço suficiente para acomodar as duas strings quando concatenadas.
As funções strcat_s(), wcscat_s(), strncat_s e wcsncat_s (defindas em cstring) fornecem alternativas seguras.
Copiando strings terminadas em nulo
A biblioteca padrão define uma função, strcpy(), que copia uma string de uma “origem” para um “destino”.
O primeiro argumento é um ponteiro para o “destino”; o segundo argumento é um ponteiro para a “origem”; ambas devem ser char*. Observe:
#includeusing std::cout; using std::endl; void main() { char* s1 = "Elemar Junior"; char* s2 = new char[strlen(s1) + 1]; strcpy(s2, s1); cout << s2 << endl; }
Devemos garantir que o destino tenha espaço suficiente para acomodar a string na origem.
A função strcpy_s() é mais segura que strcpy . Ela requer um argumento extra entre o destino e a origem que especifica o tamanho do buffer de destino.
Para usar strcpy_s , precisa incluir os headers cstring e cerrno.
Comparando strings terminadas em nulo
A função strcmp() compara duas strings terminadas em nulo. A função retorna um valor inferior a zero, zero ou um valor superior a zero, dependendo se a primeira string for menor, igual ou maior que a segunda.
Agora, exemplos:
#includeusing std::cout; using std::endl; void main() { char* s1 = "S1"; char* s2 = "S2"; cout << strcmp (s1, s2) << endl << strcmp(s1, s1) << endl << strcmp(s2, s1) << endl; }
Executando:
A função wcscmp() é a versão wide-char para strcmp();
Era isso!
10/10/2011
Não seria melhor usar um #include ?
É bem mais C++. é o port otimizado da do C90.