Ir ao conteúdo

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


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

@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
Postado

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

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!