Obter comprimento do array Char em C
-
Use o operador
sizeof
para localizar o comprimento do array de caracteres -
Use a função
strlen
para encontrar o comprimento do array Char
Este artigo irá explicar vários métodos para obter o comprimento de um array char
em C.
Use o operador sizeof
para localizar o comprimento do array de caracteres
O tamanho do array pode ser calculado usando o operador sizeof
, independentemente do tipo de dado do elemento. Embora, ao medir o tamanho do array, possa haver alguns erros hediondos se os detalhes internos forem ignorados.
A saber, o exemplo a seguir está inicializando duas arrays chamadas arr
e arr2
com notações diferentes. Em seguida, os tamanhos de ambas as arrays são recuperados usando o operador sizeof
e impressos no console.
Observe que o tamanho do segundo array é igual a 18 bytes, embora haja apenas 17 elementos impressos. A causa deste problema está oculta no método de inicialização, ou seja, quando o array char
é inicializado usando um valor literal de string, o byte nulo de terminação também é armazenado como parte do array. Assim, o operador sizeof
inclui este byte na soma de todos os elementos e retorna o resultado correspondente.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printCharArray(char *arr, size_t len) {
for (size_t i = 0; i < len; ++i) {
printf("%c, ", arr[i]);
}
printf("\n");
}
int main(int argc, char *argv[]) {
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
char arr2[] = "array initialized";
printCharArray(arr, sizeof arr);
printf("size = %lu bytes \n", sizeof arr);
printf("\n");
printCharArray(arr2, sizeof arr2 - 1);
printf("size = %lu bytes \n", sizeof arr2);
exit(EXIT_SUCCESS);
}
Resultado:
a, b, c, d, e, f, g,
size = 7 bytes
size = 24 bytes
a, r, r, a, y, , i, n, i, t, i, a, l, i, z, e, d,
size = 18 bytes
size = 17 bytes
Use a função strlen
para encontrar o comprimento do array Char
Em alguns cenários, arrays char
que foram inicializados ou armazenados como cadeias de caracteres terminadas em nulo podem ser medidos quanto ao tamanho usando a função strlen
, que faz parte dos utilitários de cadeia de caracteres da biblioteca C padrão.
Se executarmos o código de exemplo anterior com valores calculados strlen
, obteremos números diferentes causados por problemas separados. O primeiro - tamanho do objeto arr
é impresso com 24 bytes porque a função strlen
itera através de um array char até que o byte nulo final seja encontrado. Assim, chamar strlen
no objeto arr
resultou na iteração sobre arr
e arr2
, uma vez que o primeiro array não termina com byte nulo e o compilador armazenou o arr2
continuamente depois dele, resultando em um tamanho igual à soma de ambas as arrays menos 1 (descartando o byte nulo de terminação).
Observe que a função lengthOfArray
implementada por nós imita o comportamento de contagem strlen
e resulta nos mesmos números. Para o segundo objeto de array - arr2
, strlen
retornou o número de caracteres impressos sem o último byte nulo, o que pode ser útil em alguns cenários, mas não representa o tamanho real do array.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printCharArray(char *arr, size_t len) {
for (size_t i = 0; i < len; ++i) {
printf("%c, ", arr[i]);
}
printf("\n");
}
long lengthOfArray(const char *arr) {
long size = 0;
while (*arr) {
size += 1;
arr += 1;
}
return size;
}
int main(int argc, char *argv[]) {
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
char arr2[] = "array initialized";
printCharArray(arr, sizeof arr);
printf("size = %lu bytes \n", sizeof arr);
printf("size = %lu bytes \n", strlen(arr));
printf("size = %lu bytes \n", lengthOfArray(arr));
printf("\n");
printCharArray(arr2, sizeof arr2 - 1);
printf("size = %lu bytes \n", sizeof arr2);
printf("size = %lu bytes \n", strlen(arr2));
printf("size = %lu bytes \n", lengthOfArray(arr2));
exit(EXIT_SUCCESS);
}
Resultado:
a, b, c, d, e, f, g,
size = 7 bytes
size = 24 bytes
size = 24 bytes
a, r, r, a, y, , i, n, i, t, i, a, l, i, z, e, d,
size = 18 bytes
size = 17 bytes
size = 17 bytes
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook