Logo Hardware.com.br
Fábio novato
Fábio novato Super Participante Registrado
242 Mensagens 66 Curtidas

[Resolvido] Linguagem C - Usar "setlocale"

#1 Por Fábio novato 15/07/2016 - 22:52
Boa noite a todos, estava fazendo um simples programa no Code Blocks para calcular o IMC (Índice de Massa Corporal) e até aí tudo bem, só que quis incrementar um pouco o programa usando a biblioteca locale.h para aceitar os acentos da língua portuguesa e não entendi o porque está dando erro.
Usando o setlocale (LC_ALL, ""), após digitar a altura o programa pula para os próximos 'printf's' e termina (como se o buffer estivesse cheio). Gostaria de saber o motivo.

Sem setlocale, tudo certo:

[Code=C]
#include
#include // para usar função POW
#include

#define LIMITE 30 //Limite do IMC - Se o IMC for maior que 30 é considerado obeso


int main(){


float altura, peso, imc;

printf("Digite sua altura: \n");
scanf("%f", &altura);

printf ("\nQual é seu peso? \n");
scanf("%f", &peso);

imc=peso/pow(altura,2);

printf("\nSeu IMC é: %2.2f \n\n" , imc);

if (imc<=LIMITE){
printf("\nVocê não é obeso. \n");
}
else printf("\nVocê precisa emagrecer!\n");

getchar();
return 0;
}

[/Code]


Com setlocale:
[Code=C]
#include
#include
#include

#define LIMITE 30 //Limite do IMC - Se o IMC for maior que 30 é considerado obeso


int main(){

setlocale(LC_ALL, "");


float altura, peso, imc;

printf("Digite sua altura: \n");
scanf("%f", &altura);

printf ("\nQual é seu peso? \n");
scanf("%f", &peso);

imc=peso/pow(altura,2);

printf("\nSeu IMC é: %2.2f \n\n" , imc);

if (imc<=LIMITE){
printf("\nVocê não é obeso. \n");
}
else printf ("\nVocê precisa emagrecer!\n");



getchar();
return 0;
}
[/Code]
Responder
MtTech
MtTech Membro Junior Registrado
98 Mensagens 12 Curtidas
#2 Por MtTech
16/07/2016 - 11:15
Também não consegui entender o porquê disso, mas consegui resolver o problema. Notei que se você colocar setlocale(LC_ALL,"C") ou qualquer outra letra ou palavra, o programa vai correr certo. Então pesquisei um pouco e encontrei este site http://linguagemc.com.br/localizacao-de-programas-com-locale-h/ e lá mostra outra maneira de deixar o programa com a acentuação em Português. O código abaxio já deve funcionar certinho:




[code=C]

#include
#include
#include

#define LIMITE 30 //Limite do IMC - Se o IMC for maior que 30 é considerado obeso


int main(){

setlocale(LC_ALL, "Portuguese");


float altura, peso, imc;

printf("Digite sua altura: \n");
scanf("%f", &altura);

printf ("\nQual é seu peso? \n");
scanf("%f", &peso);

imc=peso/pow(altura,2);

printf("\nSeu IMC é: %2.2f \n\n" , imc);

if (imc<=LIMITE){
printf("\nVocê não é obeso. \n");
}
else printf ("\nVocê precisa emagrecer!\n");



getchar();
return 0;
}

[/code]
Fábio novato
Fábio novato Super Participante Registrado
242 Mensagens 66 Curtidas
#3 Por Fábio novato
16/07/2016 - 12:07
Então MtTech, quando imprimo:
printf ("%s" ,setlocale(LC_ALL, ""), a saída é mesmo C e com LC_All, NULL ele mostra Portuguese.Brazil.1252 ( acho que é isso, não sei se é invertido...rs estou no celular e não conferi).


O que não entendi é o porque que ao colocar setlocale após iniciar a função main ele pula meus printf's como se o buffer já estivesse cheio, como se o scanf para ler o " peso " já pegasse algum dado fazendo com que o programa não deixe digitar o peso.
O importante não é quantas vezes você cai e sim quantas você se levanta - Morihei Ueshiba, fundador do Aikido.
MtTech
MtTech Membro Junior Registrado
98 Mensagens 12 Curtidas
#4 Por MtTech
16/07/2016 - 19:20
Fábio novato disse:
Então MtTech, quando imprimo:
printf ("%s" ,setlocale(LC_ALL, ""), a saída é mesmo C e com LC_All, NULL ele mostra Portuguese.Brazil.1252 ( acho que é isso, não sei se é invertido...rs estou no celular e não conferi).


O que não entendi é o porque que ao colocar setlocale após iniciar a função main ele pula meus printf's como se o buffer já estivesse cheio, como se o scanf para ler o " peso " já pegasse algum dado fazendo com que o programa não deixe digitar o peso.


Mas você já experimentou como eu fiz colocar "Portuguese" é que eu rodei assim e deu na perfeição.
Fábio novato
Fábio novato Super Participante Registrado
242 Mensagens 66 Curtidas
#5 Por Fábio novato
16/07/2016 - 21:28
Parte ruim:
Já fiz com de todos os modos que até então tinha pesquisado mas não consegui e não deu certo.frown.png

Parte boa:
Esse problema abriu um novo campo de estudo, onde de agora em diante vou ler sobre Unicode, UTF-8 e sei que vai ser mais um passo para meu aprendizado. ideia.png

Sobre meu programa, resolvi o problema da acentuação usando a tabela ASCII mesmo:

[code=C]#include
#include // biblioteca para usar função POW - potenciação


#define LIMITE 30 //Limite do IMC - Se o IMC for maior que 30 é considerado obeso


int main(){

float altura, peso, imc;


printf("Qual %c sua altura? \n", 130);
scanf("%f%*c", &altura);

printf ("\nQual %c seu peso? \n", 130);
scanf("%f%*c", &peso);



//Acentos em ASCII: letra 'E' agudo (é):130 letra 'E' com circumflexo(ê):136 letra 'A' com til (ã):198

imc=peso/pow(altura,2);

printf("\nSeu IMC %c:\n%2.2f \n" , 130, imc);

if (imc <= LIMITE){
printf("\nVoc%c n%co %c obeso. \n", 136, 198 , 130 );
}
else printf("\nVoc%c precisa emagrecer!\n" , 136);


getchar();
return 0;
}[/code]


Para quem quer saber mais sobre codificação de caracteres, sugiro que leia essa página. Muitos programadores que se dizem experientes talvez se surpreendam com o conteúdo da mesma.

Enfim, só me resta estudar e muito.

Tópico resolvido (ou quase...). big_green.png

Abraço e obrigado, MtTech.
O importante não é quantas vezes você cai e sim quantas você se levanta - Morihei Ueshiba, fundador do Aikido.
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal