paulo1205
(usa Ubuntu)
Enviado em 21/06/2016 - 15:02h
O tipo de retorno da função
strlen() é
size_t.
size_t não é um tipo nativo da linguagem, mas é um tipo da biblioteca padrão destinado a determinar tamanhos de objetos na memória.
size_t é definido no cabeçalho <stddef.h> (que geralmente é automaticamente incluído como resultado da inclusão de outros cabeçalhos padrão, como <stdlib.h> ou <stdio.h>), geralmente através de um comando
typedef. Como ele se destina a medir tamanhos de objetos na memória, seu valor nunca pode ser negativo, de modo que ele geralmente é equivalente a
unsigned int,
unsigned long ou
unsigned long long, dependendo da arquitetura.
Mesmo sem ser um tipo nativo,
size_t é tão importante que o resultado do operador
sizeof devolve um dado do tipo
size_t. Além disso, existe um modificador da formatação de
printf(), aplicável aos conversores de dados de tipos inteiros (i.e. "%d", "%i", "%o", "%u", "%x" e "%X"), para indicar argumentos do tipo
size_t. No caso do seu rograma, eis como ficaria a chamada a
printf() para compilar sem erros.
printf("%s contém %zd caracteres",titulo_livro,strlen(titulo_livro)); // Note o “%zd”.
Contudo, como você sabe que o valor de
strlen() nunca será negativo (porque
size_t mapeia para um tipo nativo que é sem sinal), melhor ainda seria usar “
"%zu"”.
EM TEMPO: A mensagem que você recebeu ao compilar foi uma mensagem de aviso, não propriamente de erro. A compilação com o Code::Blocks deve (ou deveria) ter dado a mesma mensagem -- talvez tenha dado e você apenas não percebeu, até porque você pode ter sido ofuscado pela janela do programa rodando. Em qualquer caso, seja na linha de comando, seja num IDE, eu recomendo ligar as opções que tornam as mensagens de aviso em mensagens de erro. Isso obriga você a corrigir código que pode até ser que funcione na sua máquina, mas pode se tornar uma grava dor de cabeça se você levar o programa para uma máquina diferente. No caso do GCC, as opções que eu recomendo são “
-Wall -Werror -O2 -pedantic”.