Ir ao conteúdo
  • Cadastre-se

C O terminador 0 de strings faz parte do seu tamanho?


Lucca Rodrigues
Ir à solução Resolvido por Ansi C,

Posts recomendados

@Midori Sim, têm várias formas de se fazer a leitura, e scanf() tem alguns probleminhas, mas ele ainda é bastante usado.

 

3 minutos atrás, Midori disse:

contando com o terminador null

Esse é um caso diferente do scanf(), né? Para o mesmo, tem que se limitar o tamanho para a quantidade de caracteres não nulos, foi assim que eu aprendi...

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

No fundo nada tem a ver. Uma declaração é algo bem mais genérico.

Veja a declaração:
 

    char frase[40];

Em geral se deve ler uma declaração da direita para a esquerda.

  • E lá estão os colchetes. Então é um array
  • Em seguida tem o número: 40. Então são 40 coisas. Como vem o '[' então essa é a contagem definitiva
  • Então aparece o identificador: 'frase': então trata-se de uma sequência linear de 40 coisas e será identifica por esse símbolo. 'frase'
  • Então aparece char, o tipo. E aí a conta fecha. Ou o programa não compila.

A conta fecha assim: será alocado um total de 40 vezes o necessário para conter um char, e o endereço inicial será frase.

Um char ocupa sizeof(char) e é isso o que será alocado.

 

A questão de usar como uma string, null-terminated como é o caso em C, é secundária. O que tem lá dentro é problema seu, do programa. Você tem acesso a 40 bytes, em geral. Nada mais. Se sua máquina usar char de dois bytes terá 80 bytes. É só isso. Se tentar acessar um byte além disso seu programa deve cancelar por Access Violation, SegFault ou sei lá que nome seu sistema vai dar. E é melhor que cancele mesmo porque estará lendo ou gravando em algo desconhecido e talvez alheio. Em épocas em que as máquinas não tinham sistemas tão sólidos como os de hoje era uma maneira de ler conteúdo de outros programas, ou mesmo de derrubar o sistema como um todo.

 

3 horas atrás, Lucca Rodrigues disse:

limitar-se os caracteres quando se lê com scanf(), teria que se usar o especificador de strings na forma %39s por questões de segurança, certo?

 

Me intrometendo em sua pergunta, essa era uma razão para usar

        fgets(frase,40,stdin); 

ao invés de scanf(), como sugeriu @Midori
 

3 horas atrás, Lucca Rodrigues disse:

scanf() tem alguns probleminhas


scanf() tem problemas ao ser usada para algo para o que não foi escrita. Teclado não é entrada formatada.

 

Voltando ao vetor


Seu programa tem essa área para usar e pode fazer o que quiser com ela. Se quer usar como string ela é terminada por nulo. Então se tem 40 pode usar até 39 não nulos. Se precisa dos 40 pode esquecer o nulo e usar outro artifício. Se quer gravar várias strings lá dentro também pode, apenas controle os ponteiros e os terminadores. Em muitos casos se aloca uma área assim, maior, tipo 4K ou 8K e dentro dela se aloca strings menores, tipo buffers de transmissão ou sinais recebidos ou pulsos de áudio, coisas que tem que chegar e serem guardadas rápido sem muita estrutura. Uma 
 "memória interna" do programa.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...