You are currently browsing Gustavo Sverzut Barbieri's articles.

Palavras-chave: C, sprintf, snprintf, asprintf, formatando strings com tamanho variável

Inspirado pelo post do Kojima eu resolvi postar uma dica para um problema similar: normalmente precisamos formatar algum texto usando a função sprintf(), porém ela requer um buffer pré-alocado.

Bem, usar sprintf() é loucura, pois buffer-overflows podem acontecer. Usamos, então, snprintf() que limita o tamanho do resultado. Mas mesmo assim podemos ficar insatisfeitos, pois ele pode sair truncado.

Porém o pessoal do GNU criou a função asprintf() que calcula e aloca a memória necessária para que tudo caiba perfeitamente, incluindo o terminador final. O uso é bem simples:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
   char *s;

   if (asprintf(&s, "argc=%d", argc) > -1) {
      printf("s=\"%s\"\\n", s);
      free(s);
   }

   return 0;
}

Lembre-se de definir _GNU_SOURCE, pois esta é uma extensão ao padrão ANSI C e POSIX. Segundo a man-page, também está disponível em sistemas BSD, vale a pena conferir.

Palavras-chave: Python, internet, http, urllib, urlopen, urlencode

O módulo urllib lhe fornece meios de acessar servidores HTTP por meios de requests GET e POST de maneira direta:

  • Acessando o conteúdo da http://codare.net:
    import urllib
    
    f = urllib.urlopen("http://codare.net")
    contents = f.read()
    f.close()
    print contents
    
  • Submetendo parâmetros (query) usando GET:
    import urllib
    
    params = {"documentation": 1, "forums": 1}
    query = urllib.urlencode(params)
    url = "http://wordpress.org/search/codare?%s" % query
    f = urllib.urlopen(url)
    contents = f.read()
    f.close()
    print contents
    
  • Submetendo parâmetros usando POST:
    import urllib
    
    params = {"keyword": "urllib"}
    query = urllib.urlencode(params)
    url = "http://starship.python.net/crew/theller/pyhelp.cgi"
    f = urllib.urlopen(url, query)
    contents = f.read()
    f.close()
    print contents
    

Com a página em mãos, você pode utilizar expressões regulares ou algum módulo específico para processar Sgml/HTML/XML para obter seus dados.

Add to Technorati Favorites

Assuntos