Ir ao conteúdo
  • Cadastre-se

C Especificador de largura mínima de campo


kampa896

Posts recomendados

Boa noite, amigos do Fórum. De antemão, gostaria de agradecer todo o suporte que vocês tem me dado durante meu aprendizado na linguagem C.

 

Estou conforme vou avançando nos assuntos, acompanhando pelos livros indicados, e resolvendo alguns exercícios para fixação. E agora me surgiu um, sobre a utilização de alguns detalhes da função printf.

Estou usando o recurso de largura mínima de impressão do campo, para questões estéticas no momento de impressão, como se fosse uma tabulação, para alinhar a impressão.

Porém, ao utilizar um carácter com acento, esta é a única linha que sai do padrão. Isso implica alguma explicação da forma que a linguagem interpreta esses caracteres especiais?

#include <stdio.h>


int main(){



	//Declarando as variáveis do programa
	int item, codigo;
	char produto[16];
	float preco;

	/*
	Imprimindo as tabelas com item, produto, código e preço
	com formatação de largura mínima de campo para tabulação
	*/
	printf("%6s %-16s %-10s %-6s\n", "ITEM", "PRODUTO", "CÓDIGO", "PREÇO");
	printf("%6s %-16s %-10s %-6s\n", "1", "Cachorro-quente", "100", "5,00");
	printf("%6s %-16s %-10s %-6s\n", "2", "X-salada", "101", "8,79");
	printf("%6s %-16s %-10s %-6s\n", "3", "X-bacon", "102", "9,99");
	printf("%6s %-16s %-10s %-6s\n", "4", "Misto", "103", "6,89");
	printf("%6s %-16s %-10s %-6s\n", "5", "Salada", "104", "4,80");
	printf("%6s %-16s %-10s %-6s\n", "6", "Água", "105", "3,49");
	printf("%6s %-16s %-10s %-6s\n", "7", "Refrigerante", "106", "4,99");

	return 0;
}

Como os colegas podem ver na imagem em anexo, a única linha que sai do alinhamento da impressão é a linha que contém o carácter especial de acento da palavra "Água".

 

Alguém poderia me ajudar? Eu poderia incluir um espaçamento no comando de impressão, mas gostaria de entender o porquê isso aconteceu somente nesta linha.

Captura de tela de 2020-10-25 19-31-58.png

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@devair1010 obrigado pela atenção, meu amigo. Vou testar em outro IDE. Estou usando o Eclipse no Linux.

 

E antes de rodar em outro IDE, irei testar pelo terminal, bem lembrado.

 

Obrigado!

@devair1010 creio que seja no sistema Linux.

A execução pelo terminal também apresenta o mesmo problema.

Captura de tela de 2020-10-25 22-07-06.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Não vou me aprofundar muito no assunto (mesmo porque toda vez que eu cito isso no fórum vira briga), mas o seu problema é por causa da codificação do terminal e pela maneira como o compilador lida com caracteres.

 

Exemplo.

prov.png.f9678d90de8b0b8f45c003b7973cb32d.png

 

No seu terminal já está correto, ele suporta naturalmente utf-8.

Eu recomendo que você esqueça acentuação por hora, mas se você estiver interessado a sanar o problema de uma olhada nesse artigo da usp:Unicode e UTF-8 

 

Uma maneira de contornar todo o problema e de quebra ter uma melhor organização e utilizar a ncurses, se não sabe o que é, então de uma olhada nessa ultima postagem que eu fiz(Jogo da cobrinha que eu não terminei!) ela utiliza a ncurses.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@KXSY obrigado pelas dicas, meu amigo. Já salvei aqui pra ler com calma depois. Mas a minha dúvida é outra. Eu utilizei a formatação de limite de campos para a impressão do printf.

Porém, o mesmo código manteve o alinhamento no sistema Windows, como mostrou nosso amigo @devair1010.

 

Já no Linux, a impressão que envolvia a palavra "Água", não manteve o alinhamento, como nas demais linhas. Sobre a impressão correta dos caracteres, eu entendi como faz.

 

A minha dúvida é se o carácter especial, por exemplo aqueles que levam acento, são ocupados de maneira diferente na string.

E acabei de ver aqui pelo debug do Eclipse que o que eu suspeitava é isso mesmo. A palavra "Água" ocupa 5 espaços.

 

Mas de qualquer forma, este artigo da USP me será muito útil. Obrigado pela atenção. O outro assunto que você me encaminhou acho que ainda é muito avançado. Obrigado mesmo assim!

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

12 horas atrás, kampa896 disse:

@KXSY obrigado pelas dicas, meu amigo. Já salvei aqui pra ler com calma depois. Mas a minha dúvida é outra. Eu utilizei a formatação de limite de campos para a impressão do printf.

Porém, o mesmo código manteve o alinhamento no sistema Windows, como mostrou nosso amigo @devair1010.

Pois é, como eu citei acima tem mais haver com a codificação do terminal do que com o alinhamento do printf em si.

O correto seria converter cada caractere para utf-8 e só depois imprimir com printf.

 

Eu iria deixar um exemplo com ncurses, mas eu não conseguir fazer funcionar com palavras acentuadas. então aqui vai um pouco de bruxaria em C.

Spoiler

#include <stdio.h>
#include <locale.h>
#include <wchar.h>

int main(){



	//Declarando as variáveis do programa
	int item, codigo;
	char produto[16];
	float preco;

  	setlocale(LC_ALL,"");
	/*
	Imprimindo as tabelas com item, produto, código e preço
	com formatação de largura mínima de campo para tabulação
	*/
	wprintf(L"%6s %-16s %-10ls %-6ls\n", "ITEM", "PRODUTO", L"CÓDIGO", L"PREÇO");
	wprintf(L"%6s %-16s %-10s %-6s\n", "1", "Cachorro-quente", "100", "5,00");
	wprintf(L"%6s %-16s %-10s %-6s\n", "2", "X-salada", "101", "8,79");
	wprintf(L"%6s %-16s %-10s %-6s\n", "3", "X-bacon", "102", "9,99");
	wprintf(L"%6s %-16s %-10s %-6s\n", "4", "Misto", "103", "6,89");
	wprintf(L"%6s %-16s %-10s %-6s\n", "5", "Salada", "104", "4,80");
	wprintf(L"%6s %-16ls %-10s %-6s\n", "6", L"Água", "105", "3,49");
	wprintf(L"%6s %-16s %-10s %-6s\n", "7", "Refrigerante", "106", "4,99");

	return 0;
}

Isso provavelmente não vai funcionar em windows (pelo menos não nos mais antigos).

O exemplo que eu dei utiliza wide strings, é eu não sei se e correto utilizá-lo (eu estudei pouco sobre a biblioteca wchar.h) e todos os livros que eu li sobre C dizem para converter primeiro e imprimir depois.

 

Uma coisa que eu ia esquecendo é, de uma olhada na tabela ASCII que você vai entender o problema.

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!