Dúvida com declaração de variável char [RESOLVIDO]

1. Dúvida com declaração de variável char [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 28/03/2020 - 03:54h

Eu havia entendido que o correto é declarar assim:
char Text[] = {'a','b','c','\0'}; 

Então vi em algum lugar pela Internet muito diferente!
É correto declarar assim?
char Text[] = {'a','b','c'}; 

Ao compilar: gcc Test.c -o Test -O3 -Wall -pedantic -pedantic-errors
Não informa nenhum erro relevante

Minha preocupação e dúvida está no caracter terminador, que o 2º Exemplo não possue, e eu havia entendido que toda variável char TEM que ter o caracter terminador!


  


2. MELHOR RESPOSTA

Paulo
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)





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts