EnzoFerber
(usa FreeBSD)
Enviado em 01/11/2016 - 23:00h
dausterbarbosaaa escreveu:
mas para que serve exclusivamente o sscanf?
Olá, boa noite.
A resposta do
paulo1205 é excelente e esclarece tudo o que há para ser esclarecido.
O que posso oferecer além, a título de exemplo, é a assinatura da função, um código simples e um (simples) caso de uso.
API ( https://linux.die.net/man/3/sscanf ):
#include <stdio.h>
int sscanf(const char *str, const char *format, ...);
Assinatura simples.
str é um ponteiro para
char (uma
string).
format é uma
string de formato, obedecendo a mesma sintaxe de
scanf().
... (três pontos) é a forma de dizer que a função toma argumentos variáveis (tenho um artigo aqui no VoL sobre funções variádicas, se interessar).
Código de exemplo:
#include <stdio.h>
int main(void)
{
int a, b, c;
char d, e;
char *str = "1 2 3 x y";
sscanf(str, "%d %d %d %c %c", &a, &b, &c, &d, &e);
printf("a: %d\n", a);
printf("b: %d\n", b);
printf("c: %d\n", c);
printf("d: %c\n", d);
printf("e: %c\n", e);
return 0;
}
Saída do programa:
$ ./sscanf
a: 1
b: 2
c: 3
d: x
e: y
Casos de uso:
Pois bem. A família de funções
scanf é uma das mais complexas da
libc. Infelizmente, elas não são recomendadas para uso direto com strings de entrada de usuários. Usuários não seguem padrões, e essas funções são essencialmente dependentes de padrões. Qualquer desvio e seu programa será interrompido.
Essas funções normalmente não são usadas em produção. Quando são, são usadas em casos específicos onde uma entrada
padronizada é garantida. Por exemplo, suponha que seu programa leia um arquivo de configuração quando inicia. Suponhamos também que os administradores que o usarão irão ler o manual. Portanto, você terá uma entrada bem padronizada, e poderá mapear o arquivo com
mmap e então usar
sscanf para ler todas as variáveis.
Alguns programadores usam como reconhecimento condicional em strings construídas dinamicamente (o que não recomendo, variáveis de estado são melhores...).
Infelizmente, se você não esclarecer melhor o que quer saber sobre a
sscanf não dá pra falar muita coisa. O que vai te esclarecer muita coisa é o manual:
man sscanf
Espero ter ajudado,
Enzo Ferber
[]'s
$ indent -kr -i8 src.c
"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right."
- linux/Documentation/CodingStyle - TORVALDS, Linus.