Outra ação muito útil é dividir uma string em tokens, ou seja, dividir uma string em todos os pontos onde existir um determinado caracter.
É o que vamos aprender na aula de hoje. Como dividir uma String em tokens com a função strtok() em C.
Diferentemente das funções anteriores, esta exige um pouco mais de atenção. Inicialmente precisamos de uma variável do tipo ponteiro para caracter. No código de exemplo a seguir chamamos essa variável de pt. O asterisco usado no momento da criação da variável nos diz que ela é um ponteiro.
A seguir, esta variável recebe o retorna da função, que é um ponteiro. A função strtok recebe dois parâmetros. O primeiro parâmetro é a string que desejamos dividir. O segundo parâmetro é uma string contendo todos os caracteres pelos quais desejo dividir a minha string. No nosso exemplo, a string palavra está sendo dividida toda vez que for encontrado uma exclamação, um ponto ou um espaço.
Contudo, como pode ser visto no exemplo a seguir, nossa string será dividida em 5 pedaços. Precisamos de uma repetição para obter cada pedação de nossa string dividida.
Observe que dentro da repetição há uma alteração na forma como usamos a função. O primeiro parâmetro é NULL. Caso seja informado a string palavra novamente, teremos um loop infinito (repetição infinita) sempre pegando a palavra “Bom”.
Quando obtermos a palavra “dia”, que é a última parte de nossa string, o ponteiro pt receberá NULL, finalizando assim a repetição.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char palavra[50] = {"Bom!dia.simpatia Bom dia"}; char *pt; pt = strtok(palavra, "!. "); while(pt){ printf("token: %s\n", pt); pt = strtok(NULL, "!. "); } return 0; }
Wagner,
tudo bem?
Desculpe o “atraso” , mas estou com uma dúvida que não consegui resolver:
a função strtok() funcionou comigo bacaninha, mas, alguns tokens de retorno, quando são muito grandes dá erro,
como eu posso saber qual é tamanho da string para receber a cada leitura de strtok()? Quando o texto é “comportado” quer dizer com alguns caracteres, fica legal, mas se tem por exemplo, uns 300 carateres , dá erro, tem como me dar uma luz??
abraço
Isaias
Olá, poderia me tirar uma dúvida sobre a função strtok?
Como eu faria para armazenar separadamente cada palavra coletada da string sem precisa imprimir?
Por exemplo, numa string str que contem (Fulano 34 Pardo);
se eu fizesse
char *pt = strtok(str, ” “);
e precisasse armazenar em char name[20] a o que foi indicado na função acima.
Tentei fazer com strcpy ou atribuindo diretamente posição por posição por meio de um for, mas não obtive sucesso.
De antemão já agradeço muito!
Olá 20/09 (rsrs)
É exatamente a função strcpy que precisa ser utilizado para resolver este problema. Em C não é possível copiar uma string fazendo uma atribuição. Outro detalhe é que você tem 3 palavras na string, então você precisa de uma matriz de string para armazenar cada uma individualmente, ou 3 vetores. De uma olhada no código a seguir e tente entender o que você fez de errado quando tentou usar a função strcpy.
int main(){
char palavra[50] = {“Fulano 34 pardo”};
char mat[3][25];
char *pt;
int i = 0;
pt = strtok(palavra, “!. “);
while(pt){
strcpy(mat[i], pt);
pt = strtok(NULL, “!. “);
i++;
}
printf(“token 1: %s\n”, mat[0]);
printf(“token 2: %s\n”, mat[1]);
printf(“token 3: %s\n”, mat[2]);
return 0;
}