Jump to content

String com espaços


YsoSirius
 Share

Recommended Posts

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?

Link to comment
Share on other sites

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

Edited by apocsantos
geshi
Link to comment
Share on other sites

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");
}
Edited by apocsantos
geshi
Link to comment
Share on other sites

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

Edited by 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"

Link to comment
Share on other sites

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

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.