Entonces de esto:
"+CBC: 0,100,4207\r\nOK\r\n"
Queres obtener esto:
+CBC:
0
100
4207
OK
Es asi ? Este codigo lo realiza (probado en eclipse con GCC Linux)
const char delimitador[]=": ,\r\n";
int main(void) {
char string[20], *ptr;
int i;
char datos[8][10]; // 8 por si se necesita mas de 5 que es este string, sino con 5 basta
strcpy(string
,"+CBC: 0,100,4207\r\nOK\r\n"); // ejemplo de lo que debe llegar ptr
= strtok(string
, delimitador
);
i=0;
while(ptr != NULL)
{
i++;
ptr
= strtok(NULL
,delimitador
); }
}
Si no te importa el OK y queres cortarlo al primer \r, entonces tal ves te convenga primero pasar por todos los lugares buscando el \r o \n y apenas encuentre 1 le ponga un 0x00 y ademas salga. Antes de comenzar lo del token.
const char delimitador[]=": ,\r\n";
int main(void) {
char string[25], *ptr;
int i;
char datos[8][10];
strcpy(string
,"+CBC: 0,100,4207\r\nOK\r\n"); // ejemplo de lo que debe llegar
ptr = string;
while(*ptr)
{
if(*ptr == '\r' || *ptr == '\n')
{
*ptr = '\0';
break;
}
ptr++;
}
ptr
= strtok(string
, delimitador
);
i=0;
while(ptr != NULL)
{
printf("%s\r\n",&datos
[i
][0]); i++;
ptr
= strtok(NULL
,delimitador
); }
return EXIT_SUCCESS;
}
Salida:
+CBC:
0
100
4207
OK
La ventaja anterior es que no importa si no existe la "\n" o la "\r", funcionaria igual. Otra forma seria que si supone que SI o SI primero va el \r primero y luego le sigue SI o SI un \n seria hacer:
const char delimitador[]=": ,\r";
int main(void) {
char string[25], *ptr;
int i;
char datos[8][10];
strcpy(string
,"+CBC: 0,100,4207\r\nOK\r\n"); // ejemplo de lo que debe llegar
ptr
= strtok(string
, delimitador
);
i=0;
while(ptr != NULL)
{
if(*ptr != '\n')
{
printf("%s\r\n",&datos
[i
][0]); i++;
}
ptr
= strtok(NULL
,delimitador
); }
return EXIT_SUCCESS;
}
La ventaja es no tener que pasar por todos los elementos de antes, la desventaja es que SI o SI depende que exista "\r" y "\n" juntos y en orden.
La salida es la misma que la anterior, sin el OK