Como el título indica, mi pregunta es cómo obtener el tamaño de una cadena en C
. ¿Es bueno usar sizeof
si lo he declarado (la cadena) en una función sin malloc
en ella? ¿O, si la he declarado como un puntero? ¿Y si lo he inicializado con malloc
? Me gustaría tener una respuesta exhaustiva.
Puede utilizar strlen. El tamaño se determina por el carácter nulo de terminación, por lo que la cadena pasada debe ser válida.
Si quieres obtener el tamaño del buffer de memoria, que contiene tu cadena, y tienes un puntero a ella:
sizeof
para obtener su tamaño.Si estás confundido sobre la diferencia entre arrays dinámicos y estáticos, revisa esto.
Utilice strlen
para obtener la longitud de una cadena terminada en cero.
sizeof
devuelve la longitud del array no de la cadena. Si es un puntero (char *s
), no un array (char s[]
), no funcionará, ya que devolverá el tamaño del puntero (normalmente 4 bytes en sistemas de 32 bits). Creo que un array será pasado o devuelto como un puntero, por lo que perderías la posibilidad de usar sizeof
para comprobar el tamaño del array.
Así que, sólo si la cadena abarca todo el array (por ejemplo, char s[] = "stuff"
), el uso de sizeof
para un array definido estáticamente devolvería lo que quieres (y sería más rápido ya que no necesitaría hacer un bucle para encontrar el terminador nulo) (si el último carácter es un terminador nulo, tendrás que restar 1). Si no abarca todo el array, no devolverá lo que quiere.
Una alternativa a todo esto es almacenar realmente el tamaño de la cadena.
Mientras que sizeof
funciona para este tipo específico de cadena:
char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
No funciona si str
es un puntero (sizeof
devuelve el tamaño del puntero, normalmente 4 u 8) o un array con la longitud especificada (sizeof
devolverá el número de bytes que coincida con la longitud especificada, que para el tipo char son los mismos).
Sólo tiene que utilizar strlen()
.