Funções de string em C

maio 7, 2007 às 3:17 | Publicado em artigos, C, linux, string | 12 Comentários

Perdendo meu tempo em canais de IRC (no #motd da freenode pra ser mais exato), numa rara conversa útel com o Narcotic veio a idéia de falar e comentar exemplos de uso de várias funções de manuseio de strings em C (geralmente começado com str). São várias, mas irei comentar 3 funções dessas por post. Com isso espero esclarecer as dúvidas de muitas pessoas, principalmente aquelas novatas na linguagem e as esquecidas (como eu! 😀 ).

Todas as funções são documentadas nas man pages, e as mesmas estou usando como base. As funções dos exemplos tem as mesmas declarações para melhor ser assimilado na consulta. Para ubuntu users: $ sudo apt-get install manpages-dev

Função strstr():

char *strstr(const char *haystack, const char *needle);

A função strstr() procura a primeira ocorrência de uma string (needle) em outra string determinada (haystack). Caso a condição seja satisfeita, um ponteiro com posição da ocorrência será retornado. Caso contrário, NULL será retornado.

(Para melhor visualizar, faça o download do fonte: strstr_ex.c)

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {

        char *haystack = "Essa eh uma frase de exemplo para encontrarmos uma string.";
        char *needle = *(argv+1);
        char *ret;

        /* Ha alguma ocorrencia de needle em haystack? */
        if ((ret = strstr(haystack, needle)) != NULL) { 
                fprintf(stdout, "needle ENCONTRADO\\n");
                /* O retorno eh o ponteiro para a primeira ocorrencia em diante. */
                fprintf(stdout, "retorno: %s\\n", ret);
        } else
                fprintf(stdout, "needle NAO ENCONTRADO\\n");

        return 0;
}

ip_fix@konoha:~/C$ gcc -Wall -o strstr_ex strstr_ex.c
ip_fix@konoha:~/C$ ./strstr_ex teste
needle NAO ENCONTRADO
ip_fix@konoha:~/C$ ./strstr_ex exemplo
needle ENCONTRADO
retorno: exemplo para encontrarmos uma string.
ip_fix@konoha:~/C$ ./strstr_ex encontrarmos
needle ENCONTRADO
retorno: encontrarmos uma string.
ip_fix@konoha:~/C$

Como esperado, quando há uma ocorrência satisfeita o ponteiro é retornado a partir desse resultado.

Função strdup():

char *strdup(const char *s);

A função strdup() é muito útil em situações onde temos que alocar um espaço na memória para copiar determinada string. Sem utiliza-lá, teríamos que alocar o espaço antes com malloc(), para em seguida usar strncpy(), por exemplo, para copiar a string. A função retorna um ponteiro com a string já alocada (podendo ser liberado com free() depois de seu uso) em caso de sucesso, ou ENOMEM como erro caso a memória não tenha sida alocada por insuficiência.

(Para melhor visualizar, faça o download do fonte: strdup_ex.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {

        char *string;
        char *s = *(argv+1);

        /* SEM strdup() */

        /* Alocamos a memoria com malloc(). */
        string = (char *)malloc(strlen(s)); 
        /* Copiamos o conteudo de s pra dentro de string. (agora que possui espaco alocado). */
        strncpy(string, s, strlen(s)+1); 
        fprintf(stdout, "Sem strdup(): %s\\n", string);
        /* Liberamos o espaco alocado. */
        free(string); 

        /* COM strdup() */

        /* Alocamos a memoria exata e jah copiamos o conteudo s para dentro da string. */
        string = strdup(s);
        fprintf(stdout, "Com strdup(): %s\\n", string);
        /* Liberamos o espaco alocado (dessa vez por strdup()). */
        free(string);

        return 0;
}

ip_fix@konoha:~/C$ gcc -Wall -o strdup_ex strdup_ex.c
ip_fix@konoha:~/C$ ./strdup_ex "teste de string"
Sem strdup(): teste de string
Com strdup(): teste de string
ip_fix@konoha:~/C$

Fica bem claro a facilidade de usar strdup() em vista de que não precisamos ficar chamando malloc() e strncpy() toda vez que precisamos gravar alguma string numa variável já que a função faz todo o serviço. 😀

Função strtok():

char *strtok(char *s, const char *delim);

A função strtok() é muito útil quando precisamos “quebrar” nossa string em algum delimitador comum. Ele separa os tokens de tal forma que podemos trabalhar individualmente em cada pedaço. A função retorna um ponteiro para o próximo token ou retorn NULL caso tenha chegado ao fim.

(Para melhor visualizar, faça o download do fonte: strtok_ex.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

        /* Alocamos e copiamos a frase dentro de s. */
        char *s = strdup("Essa eh uma frase de exemplo."); 
        /* Delimitador. Nesse caso quebraremos a string nos espacos em branco. */
        char *delim = " "; 
        char *res;

        /* Primeira chamada antes do laco. */
        res = strtok(s, delim);

        while (res != NULL) {
                fprintf(stdout, "%s\\n", res);
                /* Repetimos a chamada ate o fim da string. */
                res = strtok(NULL, delim);
        }

        /* Liberamos o espaco alocado. */
        free(s); 

        return 0;
}

ip_fix@konoha:~/C$ gcc -Wall -o strtok_ex strtok_ex.c
ip_fix@konoha:~/C$ ./strtok_ex
Essa
eh
uma
frase
de
exemplo.
ip_fix@konoha:~/C$

Assim vemos grande utilidade quando pensamos em “parsear” algum tipo de dados que possua algum delimitador em comum. Claro que coisas simples, mas já um ponta pé inicial de implementações mais complexas que podem ser adaptadas.

Encerro por hoje esse post básico mas que tenho certeza que deixa claro para muita gente o uso dessas simples funções que muitas vezes é uma mão na roda em algumas tarefas. Em breve postarei mais funções interessantes com exemplos. Espero ter mais retornos no comentários, adoro dúvidas e sugestões! 😛

Anúncios

Crie um website ou blog gratuito no WordPress.com.
Entries e comentários feeds.