Ir ao conteúdo

C++ Resultado "estranho" ao percorrer uma array de char


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

Salve galera, sou iniciante em C++, e queria sanar a minha seguinte duvida:

Gostaria de saber o porque só mostra Olá na saída da execução do programa, sendo que se eu colocar pra imprimir o valor de "tam", ele mostra seis caracteres, então o correto seria percorrer seis vezes

int main(int argc, char const *argv[])
{
    char nome[] = {'O', 'l', 'a'}; 
    int tam;
    for (tam =0; nome[tam]; tam++);

    for (int i = 0; i < tam; i++) 
    {
        printf("Encontrado %c - posicao: %d\n", nome[i], i);
    }

    return 0;
}
                            
// Saída sem o "cout << tam": Ola.
// Se eu adicionar "cout << tam" no final do código, ele me mostra todo o conteúdo da array.
// Saída com "cout << tam": 
Encontrado O - posicao: 0                            
Encontrado l - posicao: 1
Encontrado a - posicao: 2
Encontrado ♥ - posicao: 3
Encontrado   - posicao: 4
Encontrado   - posicao: 5
  • Obrigado 1
Postado

@LuizHenrique.    o compilador reconhece o valor zero como falso ,  e os outros números como verdadeiro , e ali no primeiro for , ele começa em zero e vai até enquanto o valor na posição do vetor nome for verdadeiro , e isso quer dizer que qualquer coisa que estiver na memória será considerado como verdadeiro ,  e assim ele prossegue incrementando a variável tam , até encontrar a única coisa que faz ele parar , que é o valor zero ou nulo , ou nada naquela posição de memória ,  então dependendo do que esteja na memória , a partir da posição inicial do vetor nome , será o valor de tam , aqui por exemplo ele imprimiu várias vezes que o valor de tam é 5 ,   o melhor é delimitar o final do vetor colocando o finalizador de string  "  \0 " , e seu código poderia ser assim  :

#include <iostream>
using namespace std;
int main(){
    system("color ec");
    char nome[]={'O','l','a','\0'};
    int tam;
    for(tam=0; nome[tam]; tam++);
    cout<<nome<<endl;
    for(int i = 0; i < tam; i++){
        printf("Encontrado %c - posicao: %d\n", nome[i], i);
    }
    cout<<"Valor De Tam = "<<tam<<endl;
    return 0;
}

 

  • Obrigado 1
Postado
5 horas atrás, devair1010 disse:

@LuizHenrique.    o compilador reconhece o valor zero como falso ,  e os outros números como verdadeiro , e ali no primeiro for , ele começa em zero e vai até enquanto o valor na posição do vetor nome for verdadeiro , e isso quer dizer que qualquer coisa que estiver na memória será considerado como verdadeiro ,  e assim ele prossegue incrementando a variável tam , até encontrar a única coisa que faz ele parar , que é o valor zero ou nulo , ou nada naquela posição de memória ,  então dependendo do que esteja na memória , a partir da posição inicial do vetor nome , será o valor de tam , aqui por exemplo ele imprimiu várias vezes que o valor de tam é 5 ,   o melhor é delimitar o final do vetor colocando o finalizador de string  "  \0 " , e seu código poderia ser assim  :


#include <iostream>
using namespace std;
int main(){
    system("color ec");
    char nome[]={'O','l','a','\0'};
    int tam;
    for(tam=0; nome[tam]; tam++);
    cout<<nome<<endl;
    for(int i = 0; i < tam; i++){
        printf("Encontrado %c - posicao: %d\n", nome[i], i);
    }
    cout<<"Valor De Tam = "<<tam<<endl;
    return 0;
}

 

Entendi, mas o estranho eh que ele só imprime até 5, se eu imprimir o valor de tam.

Acho que com essas imagens você entende melhor:

S85Uuri.png

 

lFO5zAt.png

 

 

@EDIT

Estava debugando  o código, o valor de tam é igual a 3, quando eu não coloco pra imprimir o valor dele, isso porque tem o caractere "\0", porém se eu colocar pra imprimir o valor de "tam", esse caractere some, e o loop continua até chegar no valor seis. Gostaria de saber o por quê que isso está acontecendo

  • Curtir 1
  • Solução
Postado
13 horas atrás, LuizHenrique. disse:

Gostaria de saber o porque só mostra Olá na saída da execução do programa, sendo que se eu colocar pra imprimir o valor de "tam", ele mostra seis caracteres, então o correto seria percorrer seis vezes

 

Olá

 

Se

  •  eu colocar pra imprimir o valor de "tam", ele mostra seis caracteres

Então

  • , então o correto seria percorrer seis vezes

Talvez esse não seja o correto então...

 

Então não

Imagino que queria imprimir "Ola" simplesmente. Seu vetor nome tem as 3 letras em 3 posições, mas isso nada quer dizer em relação ao tamanho. Não existe esse conceito para um vetor de char e assim sua variável tam fica sem sentido

 

string em C

No caso de uma string em C temos um vetor de char terminado por um 0, ou \x00 ou \0 ou NULL como queira chamar um byte com zero.

 

Exemplo

	char nome[] = { 'O', 'l', 'a' };
	char Nome[] = "Ola";
	printf("vetor com 3 char, '%c' '%c' '%c'\n", nome[0], nome[1], nome[2]);
	printf("string com 3 char '%s'\n", Nome);  
	printf("strlen(Nome) = [%d]\n", strlen(Nome));

Mostra 

vetor com 3 char, 'O' 'l' 'a'
string com 3 char 'Ola'
strlen(Nome) = [3]

Entenda que nome e Nome são coisas distintas em C. Quando você escreve char coisa[] = "coisa" o compilador insere um 0 ao final, de modo a string fica automaticamente delimitada e com tamanho 6 porque tem 5 bytes antes do 0. Cinco é o resultado de strlen(coisa), a função em C que faz o que você tentou fazer com tam. Mas na verdade o vetor coisa ocupa seis bytes. Sim, muito chato isso.

 

Esse é o oficial. De volta ao seu programa

    for (tam = 0; nome[tam]; tam++);

 


Essa instrução não faz nada exceto incrementar o valor de tam até nome[tam] ser falso. Em C zero é falso e você tem sua resposta: a menos que seu programa aborte dando erro por acesso a memória que não pertence a ele. No oficial você só poderia acessar até nome[2].

Se seu programa não cancelar antes, quando aparecer um byte com zero a partir de nome[3], claro, esse vai ser o valor de tam... Pode ser muito muito grande...

 

Como @devair1010 sugeriu, você poderia acrescentar um 0 ao final de nome[] e aí seu comando funcionaria.:

    char nome[] = { 'O', 'l', 'a', '\0' };
    char Nome[] = "Ola";
    printf("vetor com 3 char, '%c' '%c' '%c'\n", nome[0], nome[1], nome[2]);
    printf("string com 3 char '%s'\n", Nome);  
    printf("strlen(Nome) = [%d]\n", strlen(Nome));
    int tam;
    for (tam = 0; nome[tam]; tam++);
    printf("tam depois do for %d\n", tam);
    for (int i = 0; i < tam; i++)
    {
        printf("Encontrado %c - posicao: %d\n", nome[i], i);
    }


Mostra então

vetor com 3 char, 'O' 'l' 'a'
string com 3 char 'Ola'
strlen(Nome) = [3]
tam depois do for 3
Encontrado O - posicao: 0
Encontrado l - posicao: 1
Encontrado a - posicao: 2

Espero que tenha ajudado

 

adicionado 2 minutos depois

Enquanto estiver aprendendo, talvez seja melhor escrever comandos mais explícitos do que usar coisas como nome[tam] para encerrar um for...

  • Curtir 1
  • Obrigado 1
Postado

@LuizHenrique.     provavelmente seja por causa do que tem na memória , experimente rodar em outro pc , creio que vai ter resultado diferente ,  e também pode ser por você estar usando outro compilador ,  aqui estou usando o code blocks e  ele imprimiu outros itens do array , com ou sem o cout para o valor de tam :

2091317010_percorrervetor.JPG.83610e67a812f1b4d151b05a35e10aba.JPG

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