Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

YsoSirius

String com espaços

Mensagens Recomendadas

YsoSirius

Boa noite.

Eu tenho um problema no meu código que é o seguinte:

tenho uma string que vai guardar, por exemplo, o nome de uma pessoa para um ficheiro de texto, mas acontece que no scanf caso o nome contenha um espaço (ex. Rui Josefino) quando listo o conteudo do ficheiro conta Rui como uma string e Josefino como outra...

Ha alguma maneira de o scanf ler um nome com espaços e atribuir tudo á mesma string?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

Boa noite,

scanf ("%[^\n]%*c", nome); //lê até que o valor entrado seja "new-line"

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
YsoSirius

Quando utilizo essa opção acaba por me dar uns bugs

int escrever()
{
estrutura ex;
FILE *fp;
fp = fopen("nomes.dat","ab");
if( fp == NULL )
{
 printf("Ficheiro nao existe.\n");
 return 0;
}
printf("Nome:\n");
scanf("%[^\n]%*c", ex.nome);
printf("Idade:\n");
scanf("%d", &ex.idade);
fwrite(&ex, sizeof(estrutura),1, fp);
printf("YES!!\n");
fclose(fp);
}

O nome sai desconfigurado quando vou listar e está a passar afrente a parte de pedir a idade

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
YsoSirius

Caso seja preciso:

#include <stdio.h>
#include <stdlib.h>
#define TAM 200
typedef struct MinhaEstrutura
{
char nome[TAM];
int idade;
} estrutura;

int listar()
{
FILE *fp;
estrutura x;
fp = fopen("nomes.dat","rb"); // read mode
if( fp == NULL )
{
 printf("Ficheiro nao existe\n");
}
printf("\n");
printf("Conteudo:\n");
while(fread(&x, sizeof(struct MinhaEstrutura), 1, fp)==1)
{
 printf("%s %d\n",x.nome, x.idade);
}
fclose(fp);
printf("\n");
}

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

Boa noite,

int escrever()
{
estrutura ex;
FILE *fp;
fp = fopen("nomes.dat","ab");
if( fp == NULL )
{
	 printf("Ficheiro nao existe.\n");
	 return 0;
}
printf("Nome:\n");
scanf("%[^\n]%*c", &ex.nome); //some black magic AKA Attention!
printf("Idade:\n");
scanf("%d", &ex.idade);
fwrite(&ex, sizeof(estrutura),1, fp);
printf("YES!!\n");
fclose(fp);
}

Cordiais cumprimentos,

Apocsantos

Editado por apocsantos
geshi

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Basta fazeres:

scanf(" %[^\n]s",ex.nome);

isso está errado.

a escape sequence é somente:

%[^\n]

o s no fim indica a suposição de existência desse caracter no buffer de entrada fora da sequência de caracteres a serem guardados

é obvio que isso não faz sentido porque a sequência irá terminar quando detectar um '\n', o que diferente de 's'.

no final, irá dar um erro de leitura "invisível" porque a string é lida e o 's' final não.

no entanto, é bom saber/relembrar que isso está errado ...

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.