paulo1205
(usa Ubuntu)
Enviado em 28/03/2020 - 17:07h
O problema é o seguinte:
strings são armazenadas em
arrays de caracteres (quer sejam eles explicitamente declarados como
arrays , quer sejam obtidos por alocação dinâmica de memória e manipulados através de ponteiros), mas nem todo
array de caracteres necessariamente contém uma
string .
Para poder ser interpretado como
string , um dos elementos contidos no
array tem de ser o
byte nulo que indica o fim da
string . Se esse elemento não estiver presente dentro dos limites do
array , o conteúdo desse
array não deve ser tratado pelo seu programa como se representasse uma
string .
Por outro lado, haver um
byte nulo em meio a outros caracteres também não significa necessariamente que aqueles caracteres formam uma
string . Você tem de lembrar sempre que
char é um tipo aritmético inteiro, assim como
int e
long , e é o tipo que normalmente se usa quando você quer representar dados numéricos que não ocupem mais do que um simples
byte . Desse modo, pode fazer bastante sentido que o valor
0 faça parte de uma coleção de
bytes , mas isso não quer dizer que faça sentido passar essa coleção de
bytes para funções de manipulação de
strings .
No seu caso, você mostrou exemplos com declarações de
arrays de caracteres, em que uma pode ser interpretada como
string porque contém o
byte nulo, e outra não pode, por não o conter. Se você quiser ter certeza de que seu
array vai ser declarado com o tamanho correto e seu conteúdo inicial será seguramente interpretado como
string , deixe os colchetes vazios e use a notação do C de constantes literais de
strings para atribuir os valores iniciais.
const char str1[]="abc"; // Equivalente a “const char str1[4]={'a', 'b', 'c', 0};”, só que mais curto e mais seguro, com o compilador fazendo o trabalho braçal no seu lugar.
char nome[]="Paulo"; // Equivalente a “char nome[6]={'P', 'a', 'u', 'l', 'o', 0};”, só que mais curto etc. etc.
MAS ATENÇÃO: Note que, acima, eu falei de deixar os colchetes da declaração vazios, para que o compilador calcule o tamanho adequado para o
array que contém a contante literal de
string de um modo que contenha o
byte nulo. Entretanto, o C (mas não o C++) permite que você suprima o
byte nulo de uma contante literal de
string presente no momento de declaração de
array com atribuição de valor inicial se você colocar um valor entre parênteses e esse valor for exatamente igual ao número de caracteres contidos entre aspas. Nesse caso, o
array criado não poderá ser interpretado como
string . Veja os exemplos abaixo (o uso de
const nas declarações é só para ninguém dizer que o conteúdo poderia ser alterado entre o momento da declaração e o momento em que o
array poderia ser submetido à interpretação como
string ).
const char arr1[]="abc"; // (sizeof arr1)==4 (calculado pelo compilador), e o conteúdo de arr1 é uma string, pois o 4º elemento é nulo.
const char arr2[4]="abc"; // (sizeof arr2)==4, e o conteúdo de arr2 é uma string, pois o 4º elemento é nulo.
const char arr3[100]="abc"; // (sizeof arr3)==100, e o conteúdo de arr3 é uma string, pois todos os elementos do 4º elemento até o 100º são nulos.
const char arr4[3]="abc"; // Em C, (sizeof arr4)==3, mas o conteúdo de arr4 NÃO É UMA STRING, pois nenhum de seus elementos é nulo. Em C++, provoca erro de compilação, pois o byte nulo não é suprimido da contante literal de string, que, portanto, é maior que o array que deveria contê-la.
const char arr5[2]="abc"; // Erro de compilação (tanto em C quanto em C++), porque a contante literal de string é maior do que o array que deveria contê-la.
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)