Ir para conteúdo
Fórum Script Brasil
  • 0

Imprimir string sem quebra de linha com printf


asantos38

Pergunta

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);
	}
}

 

Editado por asantos38
título com mais clareza
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

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 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...