fearz7 Posted February 22, 2012 at 03:22 PM Report Share #440716 Posted February 22, 2012 at 03:22 PM A questão e muito simples pessoal, quero algo que me permita saber o tamanho de um vector por exemplo: int main(int argc, char** argv) { int a[] = {2, 4}; char c[] = "ola"; printf ("%d\n", strlen(c)); // resultado seria 3 printf ("%d\n", strlen(a)); // resultado da-me 1 , contudo e um vector com duas posições ... return (EXIT_SUCCESS); } Link to comment Share on other sites More sharing options...
pikax Posted February 22, 2012 at 03:34 PM Report Share #440719 Posted February 22, 2012 at 03:34 PM o strlen() é para strings, strings em C são arrays que têm '\0' que diz que a string termina. podes usar algo assim: #include <stdio.h> int main() { int a[] = {2, 4,3,5}; printf("%d\n",(sizeof(a)/sizeof(int))); return 1; } Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast." Link to comment Share on other sites More sharing options...
fearz7 Posted February 22, 2012 at 03:39 PM Author Report Share #440720 Posted February 22, 2012 at 03:39 PM Tambem ja tinha pensado nessa resolução mas nao existe outra solucao? com um ciclo while ou algo do genero? Cumps Link to comment Share on other sites More sharing options...
pikax Posted February 22, 2012 at 03:55 PM Report Share #440723 Posted February 22, 2012 at 03:55 PM é um bocado mais complicado, porque se tivermos uma array com 10 elementos, mas se só definirmos 7 elementos, os outros 3 elementos, podem ter um valor aleatório da memória ou estar em 0(conforme o compilador). já não estou muito dentro de C, mas tens esta forma tambem: #include <stdio.h> int arraylen(int ar[]) { int i; int *ptemp=ar; for(ptemp;*ptemp!=NULL;++ptemp) i++; return i; } int main() { int a[10] = {2, 4,3,5,5,7,9}; printf("%d",arraylen(a)); return 1; } Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast." Link to comment Share on other sites More sharing options...
pedrosorio Posted February 22, 2012 at 04:00 PM Report Share #440725 Posted February 22, 2012 at 04:00 PM Em primeiro lugar, que compilador é que estás a usar? Deves fazer #include pelo menos do stdio.h e do string.h. Em gcc 4.4.5, esse código dá um warning "passing argument 1 of ‘strlen’ from incompatible pointer type" ao compilar, que é precioso. O que é que te leva a crer que podes usar strlen (uma função que devolve o tamanho de uma string - array de caracteres terminado por '\0') com um array de inteiros? Aquilo que strlen faz é apenas começar no início do array e contar o número de posições que pode avançar até encontrar um 0 (o caracter '\0' de terminação de strings tem o código ASCII 0). O teu array c tem a seguinte composição: char c[] = {'o','l','a','\0'} Que em código ASCII corresponde a ter {111,108,97,0}. A função strlen conta 3 posições diferentes de 0, e quando chega à quarta encontra a terminação da string e devolve o resultado 3, que é correto. Acontece que um char ocupa 8 bits e um int ocupa 32 bits (num computador pessoal moderno). Dito de outra forma, em memória cada inteiro corresponde a 4 caracteres. Quando dizes à função strlen para interpretar o array de inteiros como se fosse uma sequência de caracteres, ele vai olhar para o que está na memória de 8 em 8 bits. Aqui temos que ter em conta um novo conceito que é a endianness do sistema (não gosto muito do artigo em português da wikipedia). Os 32 bits de um inteiro cabem em 4 bytes e estes podem estar ordenados de forma diferente. No sistema little-endian colocas os bytes com menor valor no início, no sistema big-endian colocas os bytes com maior valor no início. Um exemplo para perceberes melhor usando o sistema decimal: Se cada byte correspondesse a um algarismo decimal, escrever o número quinhentos e vinte e três em little-endian seria 325, e em big-endian 523. Acontece que o teu sistema é little-endian. Os números 2 e 4 são menores que 256 e por isso cabem num byte, ou seja, os 4 bytes que representam o número 2 são {2,0,0,0} e os 4 bytes que representam o número 4 são {4,0,0,0}. Sendo assim, o array 'a' interpretado como uma sequência de caracteres tem os seguintes valores numéricos: {2,0,0,0,4,0,0,0}. Quando strlen processa este array, encontra um 0 (código de terminação de string) no segundo elemento e por isso devolve o valor 1. Se quiseres confirmar aquilo que estou a dizer, podes percorrer o array 'a' com um apontador para caracteres e fazer print dos valores que encontras (são 2 inteiros -> 2*4 = 8 bytes): #include "stdio.h" #include "string.h" int main(int argc, char** argv) { int a[] = {2, 4}; char c[] = "ola"; char *p = (char*)a; int i; for(i=0;i<8;i++) { printf("%d\n",(int)(*p)); p++; } return 0; } Para finalizar, é importante dizer-te que (com a excepção das strings que incluem o caracter de terminação '\0') é impossível saber o número de elementos de um array em C, ou seja, tens que guardar o tamanho do array noutra variável (isto não é exatamente assim, para o caso de arrays que estão definidos no código - i.e. em que o compilador sabe o seu tamanho, podes usar sizeof(array)/sizeof(tipo)). Já agora, se o teu sistema fosse big-endian, sabes dizer-me qual seria o valor devolvido por strlen(a)? =) Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
pikax Posted February 22, 2012 at 04:07 PM Report Share #440728 Posted February 22, 2012 at 04:07 PM pedrosorio grande resposta 😁 não me tinha lembrado do big e litle endian. Eu sou adepto de utilizar um numero fixo no array, ou até utilizar uma lista ou algo do genero(se quiser aumentar o tamanho do container) Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast." Link to comment Share on other sites More sharing options...
pmg Posted February 22, 2012 at 04:19 PM Report Share #440736 Posted February 22, 2012 at 04:19 PM int a[10] = {2, 4,3,5,5,7,9}; Em C não existe inicialização parcial. Um objecto ou é totalmente inicializado (todos os sub-objectos recursivamente se necessário) ou não é, de todo, inicializado. O exemplo acima inicializa a[0] com 2, ... a[6] com 9, a[7], a[8], e a[9] com 0 (zero). Outra coisa: na função estás a comparar um int com NULL. O compilador aceita, mas faz conversões implicitas. É melhor, para as pessoas que vão ver o código, comparar com 0. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now