копирование строки из strtok - PullRequest
2 голосов
/ 25 июля 2011

Мне нужно разделить строку C на токены.Я думал, что strtok будет моей лучшей попыткой, но я получаю очень странные результаты ...

Вот моя тестовая программа.В этом примере я получу 3 токена с разделителем "##", но когда я пытаюсь работать с теми, которые якобы скопировал, только третий отображается правильно ... два других выглядят испорченными или что-то в этом роде ...t знаю ...?

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

#define TAM 3 //elements

char** aTokens(char* str, char* delimitador)
{
 char* pch;
 char** tokens;
 int i = 0; 
 tokens = (char**)malloc(sizeof(char*)*TAM);

 pch = strtok(str, delimitador);

 while(pch != NULL)
 {
  tokens[i] = (char*)malloc((sizeof(strlen(pch))+1) * sizeof(char));
  strcpy(tokens[i], pch);
  pch = strtok(NULL, delimitador);
  i++;
 }

 return tokens;
}

int main ()
{
 char str[] = "30117700,1,TITULAR,SIGQAA070,1977/11/30,M,1,14000,0.00,6600.00,10.00,2011/09/01,2012/09/01,0|17,0.00,NO,0,0,0.00, ,##30117700,1,TITULAR,SIGQAA070,1977/11/30,M,1,14000,0.00,6600.00,10.00,2011/09/01,2012/09/01,0|17,0.00,NO,0,0,0.00, ,##30117700,1,TITULAR,SIGQAA070,1977/11/30,M,1,14000,0.00,6600.00,10.00,2011/09/01,2012/09/01,0|17,0.00,NO,0,0,0.00, ,";

 char** tokens;
 int i;

 tokens = aTokens(str, "##");

 for(i = 0; i<TAM; i++)
  printf("%d -- %s\n", strlen(tokens[i]), tokens[i]);

 //Clean
 //for(i = 0; i<TAM; i++)
  //free(tokens[i]);

 //free(tokens);

 return 0;
}

вывод с GCC в Linux:

13 -- 30117700,1,T   <---- ?
13 -- 30117700,1,T   <----- ?
115 -- 30117700,1,TITULAR,SIGQAA070,1977/11/30,M,1,14000,0.00,6600.00,10.00,2011/09/01,2012/09/01,0|17,0.00,NO,0,0,0.00, ,

Я прокомментировал "чистый" раздел, потому что он также предоставляет много ошибок времени выполнения ...(

Помогите пожалуйста !!

Ответы [ 3 ]

3 голосов
/ 25 июля 2011

Я думаю, вы немного запутались в том, как работает strtok.

По большей части, вы поняли это правильно.Однако строка символов-разделителей, которая присваивается strtok, не используется как строка как таковая, а больше похожа на массив символов, и strtok заботится только об этих отдельных символах.Таким образом, вызов strtok со строкой «#» - это то же самое, что и «##».Чтобы правильно маркировать вашу строку, вам нужно выбрать один символ-разделитель для использования или использовать другую (возможно, пользовательскую) функцию токенизатора, которая может обрабатывать многосимвольные разделители.

2 голосов
/ 25 июля 2011

Следующая строка не верна. sizeof(strlen(..)) будет равно 4 (в 32-разрядном приложении) независимо от длины строки.

tokens[i] = (char*)malloc((sizeof(strlen(pch))+1) * sizeof(char));

Вероятно, должно быть:

tokens[i] = (char*)malloc((strlen(pch)+1) * sizeof(char));
1 голос
/ 25 июля 2011

Стандартная реализация strtok:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "30117700,1,TITULAR,SIGQAA070,1977/11/30,M,1,14000,0.00,6600.00,10.00,2011/09/01,2012/09/01,0|17,0.00,NO,0,0,0.00, ,##30117700,1,TITULAR,SIGQAA070,1977/11/30,M,1,14000,0.00,6600.00,10.00,2011/09/01,2012/09/01,0|17,0.00,NO,0,0,0.00, ,##30117700,1,TITULAR,SIGQAA070,1977/11/30,M,1,14000,0.00,6600.00,10.00,2011/09/01,2012/09/01,0|17,0.00,NO,0,0,0.00, ,";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str,"#");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, "#");
  }
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...