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

Nazgulled

Ler espaços com o sscanf

9 mensagens neste tópico

Tenho este simples código num programa:

if(sscanf(args, "%d,%d,%[^\n]", &x, &y, aux) == 3) {
//
}

O problema é que se eu escrever algo como "5,4,aaa bbb", o x vai tomar o valor de 5 ou y o valor de 4 e o aux o valor de "aaa" e eu queria que tomasse o valor de "aaa bbb" e neste caso o sscanf retorna 2 e não 3, logo não vai entrar no if...

já tentei procurar bues sobre o sscanf mas não encontrei solução para apanhar os espaços... se alguem puder ajudar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

http://www.cplusplus.com/ref/cstdio/sscanf.html

http://msdn2.microsoft.com/en-us/library/kwwtf9ch.aspx

Com sscanf's não vais lá. O sscanf pára SEMPRE quando encontra um espaço, tab ou newline, como está a dizer no 1º link:

s String of characters. This will read subsequent characters until a whitespace is found (whitespace characters are blank, newline and tab).

e também no 2º link:

An input field is defined as all characters up to the first white-space character (space, tab, or newline)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas deve haver alguma forma de lhe dar a volta...

num forum disseram-me k se escrevesse tipo: sscanf(args, "%d,%d,%99[^\n]", &x, &y, aux) ou outro numero tipo a dimensão do args, que funcionava, mas agora não posso exprimentar. de qualquer forma, o gajo que me disse isto, disse que como está, também funciona e apanha os espaços, no meu sistema isso não está a acontecer...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei se já resolveste o teu problema mas uma solução seria ler tudo até ao '\n', nesse caso até os espaços seriam lidos e depois efectuares um parsing à string lida, nota que esta solução pode criar alguns problemas de 'buffer overflow'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@Knitter

se reparares bem o sscanf faz isso... "%d,%d,%[^\n]"

apanha um inteiro, uma virgula, um inteiro, uma virgula e depois uma string até encontrar um \n, é isto que faz aquele código... mas deixem lá que já resolvi. este código funciona, não ha nada de mal com ele. O sscanf não irá parar nos espaços (como disseram por ai) se tiverem algo deste genero. O meu problema estava antes desta função, a variavel "args" ja chegava a este ponto sem o resto do texto...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

...(como disseram por ai)...

Não "disseram por aí". Estão ali as fontes que utilizei para dar a resposta. Acho estranho que ambos os sites, com a reputação que têm, não digam nada sobre a utilização dos parêntesis rectos. Eu não conhecia essa possibilidade.

Aqui já explicam a sua utilização.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dsc insistir mas eu já utilizei esse tipo de leitura muitas vezes e tenho a funcionar, mas não era bem isso que eu queria acrescentar :P, Normalmente uso

%[^\n]\n nesta solução o que é lido é: tudo até ao '\n' incluindo o '\n', desta forma se aparecerem espaços pelo meio eles tb são comidos.

Se continuares com problemas experimenta ir à minha página http://www.student.estg.ipleiria.pt/~ei10635, na secção de downloads estão lá trabalhos em C, escolhe o primeiro da disciplina de Sistemas Distribuidos e Paralelos, tem código para ler ficheiros e faz exactamente o que queres.

Espero no entanto que já tenhas o teu prob resolvido, fica bem.

Bem para a próxima tenho de ler melhor o teu post ;), percebi que ainda não tinhas o teu código a funcionar, dsc.

Peace.

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