Ir ao conteúdo
  • Cadastre-se

o printf dentro do for sai todo desalinhado, help


Renanzinthhh

Posts recomendados

Bom gente, estou fazendo um algoritmo aqui pra n ficar a toa, porém n consigo definir o porque disso.

O erro estranho está quando selecionamos a opção 1 e damos o nome e a matrícula, dps que imprime na tela, sai desalinhado.

Help.

#include <stdio.h>#include <string.h>#include <locale.h>#include <time.h>#include <stdlib.h>	struct dados {		char nome[3][60];		int matr;	};	struct dados aluno[3];		int main()		{			setlocale(LC_ALL,"Portuguese");						int i=0;			char esc;						for(i=0; i<80; i++)				{					printf("#");				}		do		{			printf("#                                                                              #");			printf("# Sistema escolar                                                              #");			printf("#------------------------------------------------------------------------------#");			printf("# Centro Federal de Educação Tecnológica Celso Suckow da Fonseca     2015      #");			printf("#------------------------------------------------------------------------------#");			printf("#                                   	    Data: %s - Hora: %s #",__DATE__,__TIME__);			printf("#------------------------------------------------------------------------------#");			printf("#                                                                              #");			printf("# Menu de escolhas:                                                            #");			printf("# 1 - Registrador de alunos                                                    #");			printf("# 2 - Registrador de notas                                                     #");			printf("# 3 - Mostrar alunos aprovados                                                 #");			printf("# 4 - Mostrar alunos reprovados                                                #");			printf("#                                                                              #");			printf("# Selecione uma opção: ");			scanf("%d", &esc);			system("cls");			switch(esc)				{					case 1: printf("\tRegistrador de alunos\n\n");					printf("Informe o nome dos alunos:\n\n");					for (i=0; i<3; i++)						{							fflush(stdin);							printf("Aluno %d: ", i+1);							fgets(aluno[i].nome[i],60,stdin);							printf("Matrícula: ");							scanf("%d", &aluno[i].matr);							printf("\n");							}						system("cls");						for(i=0;i<3;i++)							{								printf("%s %d", aluno[i].nome[i], aluno[i].matr);							}						break;												default:							printf("Opção inválida");					}			break;		} while	(esc != 4);			system("pause");		system("pause");		return 0;}
Link para o comentário
Compartilhar em outros sites

Por algum motivo o fgets esta inserindo um "new line" no final do nome, ai quando você vai imprimir ele ele também imprime como se fosse um \n. Da pra fazer isso dai, mas creio que tenha alguma solução mais confiável.

 

    #include <stdio.h>    #include <string.h>    #include <locale.h>    #include <time.h>    #include <stdlib.h>    	struct dados {    		char nome[60];    		int matr;    	};    	struct dados aluno[3];    	int main()    		{    			setlocale(LC_ALL,"Portuguese");    			int i=0;    			char esc;    			for(i=0; i<80; i++)    				{    					printf("#");    				}    		do    		{    			printf("\n#                                                                              #");    			printf("\n# Sistema escolar                                                              #");    			printf("\n#------------------------------------------------------------------------------#");    			printf("\n# Centro Federal de Educação Tecnológica Celso Suckow da Fonseca     2015      #");    			printf("\n#------------------------------------------------------------------------------#");    			printf("\n#                                   	    Data: %s - Hora: %s #",__DATE__,__TIME__);    			printf("\n#------------------------------------------------------------------------------#");    			printf("\n#                                                                              #");    			printf("\n# Menu de escolhas:                                                            #");    			printf("\n# 1 - Registrador de alunos                                                    #");    			printf("\n# 2 - Registrador de notas                                                     #");    			printf("\n# 3 - Mostrar alunos aprovados                                                 #");    			printf("\n# 4 - Mostrar alunos reprovados                                                #");    			printf("\n#                                                                              #");    			printf("\n# Selecione uma opção: ");    			scanf("%d", &esc);    			system("cls");    			switch(esc) {    					case 1: printf("\nRegistrador de alunos\n");    					printf("Informe o nome dos alunos:\n");    					for (i=0; i<3; i++) {    							fflush(stdin);    							printf("Aluno %d: ", i+1);    							fgets(aluno[i].nome,60,stdin);    							printf("Matrícula: ");    							scanf("%d", &aluno[i].matr);    							aluno[i].nome[strlen(aluno[i].nome)-1] = '\0';    							printf("\n");                }                  system("cls");                  for(i=0;i<3;i++) {    								printf("%s - %d\n", aluno[i].nome, aluno[i].matr);    							}    						break;    						default:    							printf("Opção inválida");    			}    			break;    		} while	(esc != 4);    			system("pause");    		system("pause");    		return 0;    }
Link para o comentário
Compartilhar em outros sites

Valeu, deu certo.

E em relação a parte do nome caso uma pessoa tenha digitado algum numero no nome pedir para repetir, aparecendo "Número inserido no nome, repita por favor"

 

E um teste para a matrícula caso a pessoa tenha digitado alguma letra, porém será somente números...

 

Tentei fazer o teste de condição aqui, porém a minha lógica hoje não estão lá essas coisas :/

Link para o comentário
Compartilhar em outros sites

Isso é mais complicado, porque você vai ter que percorrer a string, posição por posição, e comparando se o aquela posição é um numero ou não. Não sei se tem alguma função que faça isso nas bibliotecas do C, só conheço essa maneira.

EX:

#include <stdlib.h>int main() {char nome[40] = "teste12ab3ab4";int i;for (i = 0; nome[i] != '\0'; i++){  if (nome[i] < 'A')    printf("nome[%d]: nao eh uma letra!\n", i);}system("pause");}
Link para o comentário
Compartilhar em outros sites

Fiz algo tipo isso lá no código, na linha 62. https://ghostbin.com/paste/whmea#L62

 

Porém apareceu a msg de erro no Dev:

63 32 C:\Users\Renanzinth\Desktop\Algoritmos Temporários\Sist Escolar.cpp [Error] ISO C++ forbids comparison between pointer and integer [-fpermissive]

 

 

ps: Estou fazendo um algoritmo "complexo" tipo esse pra tentar saber mais do que a faculdade ensina.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...