• 0
Sign in to follow this  
asantos38

Imprimir string sem quebra de linha com printf

Question

Boa noite a todos.

Estou tendo dificuldades para corrigir um erro em meu programa. Ele funciona da seguinte forma:

Um vetor de caracteres é lido pela função fgets - um nome de pessoa.

Ao final este nome deve ser exibido ao lado da palavra reprovado ou aprovado, porém ao imprimir os resultados, alguns saem quebrados (o nome em uma linha e o resto da string em outra linha).

Segue o código:

#include <stdio.h>
#include <stdlib.h>
#define MAX 4

struct aluno{
	char nome[42];
	int idade;
	float altura;
	float notas[4];
};

typedef struct aluno ALUNO;

ALUNO getAluno();

float media(ALUNO);

void exibirResultado(ALUNO);

int main(void){
	//declaração de variáveis.
	ALUNO aluno[MAX];
	int i;

	for(i = 0; i < MAX; i++){
		printf("Cadastro do %do. aluno\n", i + 1);

		aluno[i] = getAluno();
	}
	
	for(i = 0; i < MAX; i++){
		exibirResultado(aluno[i]);
	}
	return 0;
}

ALUNO getAluno(){
	//declaração de variáveis.
	ALUNO aluno;
	int i;
	
	printf("Nome: ");
	fgets(aluno.nome, 42, stdin);

	printf("Idade: ");
	scanf("%d", &aluno.idade);

	while(getchar() != '\n');

	printf("Altura: ");
	scanf("%f", &aluno.altura);

	while(getchar() != '\n');

	for(i = 0; i < 4; i++){
		printf("%da. Nota: ", i + 1);

		scanf("%f", &aluno.notas[i]);

		while(getchar() != '\n');		
	}

	return aluno;
}

float media(ALUNO aluno){
	float m = 0;
	int i;
	
	for(i = 0; i < 4; i++){
		m += aluno.notas[i];
	}

	return m / 4;
}

void exibirResultado(ALUNO al){
	if(media(al) >= 7){
		printf("%s ----> aprovado\n", al.nome);
	}else{
		printf("%s ----> reprovado\n", al.nome);
	}
}

 

Edited by asantos38
título com mais clareza

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0
Guest

Fiz algumas mudanças em seu código para resolver a questão. Ao q parece o problema está nesses while que você está usando para limpar o buffer de entrada ou no modo de como está usando o fgets. Dá uma olhada no código e vê se ajuda:

#include <stdio.h>
#include <stdlib.h>
#include "string.h"

#define MAX 4

struct aluno{
	char nome[42];
	int idade;
	float altura;
	float notas[4];
};

typedef struct aluno ALUNO;

ALUNO getAluno();

float media(ALUNO);

void exibirResultado(ALUNO);

int main(void)
{
	//declaração de variáveis.
	ALUNO aluno[MAX];
	int i;

	for(i = 0; i < MAX; i++)
    {
		printf("Cadastro do %do. aluno\n", i + 1);

		aluno[i] = getAluno();
	}
	
	for(i = 0; i < MAX; i++){
		exibirResultado(aluno[i]);
	}
	return 0;
}

ALUNO getAluno()
{
	//declaração de variáveis.
	ALUNO aluno;
	int i;
	char *c;
	char ch;
	
	printf("Nome: ");
	fgets(aluno.nome, 42, stdin);
	strtok(aluno.nome, "\n");
	if (strlen(aluno.nome) == 42 - 1)
	{
		while ((ch = getchar()) != '\n' && ch != EOF);
	}

	printf("Idade: ");
	scanf("%d", &aluno.idade);
	scanf("%c", &c);  // essa linha é ignorada pelo compilador. Serve para limpar o buffer de entrada

	printf("Altura: ");
	scanf("%f", &aluno.altura);
	scanf("%c", &c);

	for(i = 0; i < 4; i++)
	{
		printf("%da. Nota: ", i + 1);
		scanf("%f", &aluno.notas[i]);
		scanf("%c", &c);
	}

	return aluno;
}

float media(ALUNO aluno)
{
	float m = 0;
	int i;
	
	for(i = 0; i < 4; i++)
  	{
		m += aluno.notas[i];
	}

	return m / 4;
}

void exibirResultado(ALUNO al)
{
	
	if(media(al) >= 7)
    {
		printf("%s ----> aprovado\n", al.nome);
	}
    else
    {
		printf("%s ----> reprovado\n", al.nome);
	}
}

Mas é por aí, amigo, seu código está muito bom. Apenas a maneira de limpar o buffer de entrada não está legal do modo como você fez. Sobre o fgets pode ver que usei um comando bem grandinho. Nesse caso recomendo pesquisar a respeito dessa função que daí vai entender bem a lógica que está no código do fgets que passei 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this