Jump to content

Ler espaços com o sscanf


Recommended Posts

Posted

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

Posted

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)

Desaparecido.

Posted

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

Posted

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'

Posted

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

Posted

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

Desaparecido.

Posted

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

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