• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rgcaldas

[C] Ajuda: Ler uma string com espaços

15 mensagens neste tópico

Boas

Tenho outro problema que não estou a conseguir resolver.

eu tenho uma string para a qual estou a ler o que o user coloca com um scanf, mas na string só fica o que se escreve até ao primeiro espaço. tipo:

char string[100];
  scanf("%s",string);

Com algo do genro se eu escrever - artigo teste - só la fica artigo.

Peço desculpa se isto for daquelas duvida imbecis, mas tenho andado à procura e não encontro nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Infelizmente a leitura a partir do teclado utilizando o scanf le somente ate ao primeiro espaço.......

para contornares isso usaa função gets....

gets(texto);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Infelizmente a leitura a partir do teclado utilizando o scanf le somente ate ao primeiro espaço.......

Não é bem assim... a função scanf lê a partir do teclado baseando-se na formatação que usares (exactamente a mesma coisa que o printf). Portanto, se quiseres ler espaços tens de usar "%s %s". Ainda assim, tens o problema que é cada palavra do input ficar guardada numa string diferente.

para contornares isso usaa função gets....

gets(texto);

Exacto, embora o uso do gets seja altamente desaconselhado pela maioria dos compiladores (porque pode ser usado maliciosamente), em principio não vais ter problemas desde que os utilizadores do programa não sejam maldosos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

para contornares isso usaa função gets....

gets(texto);

Thanks, já funciona

Não é bem assim... a função scanf lê a partir do teclado baseando-se na formatação que usares (exactamente a mesma coisa que o printf). Portanto, se quiseres ler

espaços tens de usar "%s %s". Ainda assim, tens o problema que é cada palavra do input ficar guardada numa string diferente.

Assim é mais critico, por não sei quantos espaços vão aparecer.

Exacto, embora o uso do gets seja altamente desaconselhado pela maioria dos compiladores (porque pode ser usado maliciosamente), em principio não vais ter problemas desde que os utilizadores do programa não sejam maldosos.

Á partida não é problema, isto é um trabalho escolar, por isso fica o gets

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

epa.... mas se meters scanf(%s %s) tambem é uma treta.... tu não sabes o q é suposto o utilizador escrever ali.... supõe que é para intrudizer o nome completo!?!?!?

não sabes se o utlizador tem 5 nomes ou 3 nomes...

como resolves uma situação dessas?

a unica solução é "meter uma abaixo" e descer um nivel.... cin >> varString1 ;)

o q achas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a unica solução é "meter uma abaixo" e descer um nivel.... cin >> varString1 ;)

o q achas?

Pensei que o cin e o cout só no c++

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hum... eu não creio q seja so no c++...

ok...deixa-me investigar uma coisinha....

ja te dou uma resposta

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim é.... tens toda a razão é uma classe derivada da std:stream, portanto so existe em STL que por sua vez é C++ ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não há crise, o gets parece resolver o problema, só fico com um stress que ainda tenho de pesquisar.

Quando o gets tenta guardar mais caracteres do que a string aguenta, a aplicação rebenta, e no linux, o gcc não me deixa definir strings variaveis, tipo char string[].

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cria apontadores de char e depois fazes um malloc.

OK ,vou experimentar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Era precisamente a esse problema do tamanho máximo que eu me referia quando falei em utilizadores mal intencionados. Assim podes (e deves) utilizar a função fgets que é usada para ler a partir de um ficheiro e que permite definir um número máximo de bytes a serem lidos.

Exemplo:

char[50] string;
fgets(string, 50, 0);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Era precisamente a esse problema do tamanho máximo que eu me referia quando falei em utilizadores mal intencionados. Assim podes (e deves) utilizar a função fgets que é usada para ler a partir de um ficheiro e que permite definir um número máximo de bytes a serem lidos.

Exemplo:

char[50] string;
fgets(string, 50, 0);

usar o fgets tem um problema, é que pode deixar caracteres no buffer.

convém verificar o tamanho da string que foi lida e se tiverem sido lidos o número máximo de caracteres convém executar o seguinte código:

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

que, normalmente, resolve o problema, embora em casos muito particular possa não funcionar bem...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para não te dar o WARNING pelo gets podes usar o seguinte:

fgets(buffer,100,stdin);

0

Partilhar esta mensagem


Link 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