Sacar numeros de telefonos de una cadena [C++]

xCoNDoR

Hola MV, se que buscando por google encontraría la solución, es más, la estaré buscando mientras leéis estos, pero para el que sepa me ahorrará tiempo.

Necesito meter en un array de int, los números de telefono que se encuentren en una cadena como esta:

"ON,666666666,633633633,612612612,600999888"

Gracias!

elkaoD

Busca en google por "tokens", "tokenizing", "tokenizer", "strtok"...

1 respuesta
xCoNDoR

Gracias #2, te agradezco la ayuda.

Aprovecho este post para otra consulta, ya que en C estoy algo verde.

Tengo una cadena de texto en una variable byte, para leerla uso un char * cadena = (char *)byte_var;

El problema es que ese byte va cambiando con los datos recibidos, y quiero almacenar la cadena para sacar guardar despues los numeros de telefono como he comentado en #1.

Estoy super perdido con los char y los punteros, he probado todo lo que se me ha venido a la cabeza y no lo consigo. Es más, no se ni si me he explicado bien.

Alguna ayuda ?

EDIT: Creo que lo he conseguido así, acepto sugerencias:

char *cadena, *numeros[10];
numeros[0] = strtok((char *)comm_buf, ",");
int i = 1;
while((cadena = strtok(NULL,","))!=NULL)
{
	numeros[i] = cadena;
	i++;
	Serial.print("-> ");
	Serial.println(cadena);
}
1 respuesta
elkaoD

#3 ojo, hablas de que tienes un byte pero en realidad tienes un puntero a una cadena de bytes (en plural.)

Necesitas copiar la cadena, ya sea recorriéndola a mano como si fuese un array (y copiando uno a uno los chars) o con strcpy.

B

La cadena tiene siempre el mismo formato ? o sea , si puedes saber que te viene un char y luego un entero y tal ...

xCoNDoR

Bueno, creo que ya solucioné el problema anterior con el strcpy pero ahora tengo otro..

Quiero comparar que dos numeros contenidos en dos char sean iguales, pero estoy teniendo problemas. Uso strstr(char, char) como en otros casos (donde no hay ningun problema), pero en este caso siempre me da un OK aunque no sea el mismo numero.
Me he asegurado de que son diferentes un char de otro, pero incluso así me da un OK siempre..

También probe con if char==char2 y nada...

Hoy no es mi día

2 respuestas
VipeR_CS

#6 strstr no es para comparar cadenas enteras, también te puede dar true si la 2ª forma parte de la 1ª. ¿No te vale http://www.cplusplus.com/reference/clibrary/cstring/strcmp/ ?

1 respuesta
xCoNDoR

#7 Ya lo he conseguido.. el for recorría mas posiciones de las que tenia el array de numeros.. y ese era el problema..

De todas formas me la apunto, no me acordaba de esa función! Gracias

elkaoD

#6 si quieres comprobar dos números contenidos en un char es:

variable == vabriable2

Te repito lo de antes, tú no tienes dos char. En todo caso, dos cadenas de char (es decir, un puntero a chars... ¡en plural!) Parece una gilipollez pero hablar con propiedad te hará entender mejor lo que estás haciendo y a nosotros poder ayudarte mejor.

1 respuesta
xCoNDoR

#9 Perdona por expresarme mal con el tema de los punteros, como comenté no los entiendo muy bien aún.

Sobre lo de los chars, si que tengo chars, puesto que con strcpy copio a un char el contenido del puntero en ese instante. Entonces tengo un char[10][10] con 10 numeros de telefono. el tamaño es 10 puesto que strcpy añade un caracter vacio (o nulo) al final.

1 respuesta
elkaoD

#10 que no copias a un char!

Un char = un carácter = un byte. EN UN BYTE NO TE CABE UNA CADENA. En un char de puede caber 'a', 'z', '1', pero no "123456789". El número de teléfono no es un char, son NUEVE CHARS.

No tienes un char. Tienes una serie de chars. Una serie de caracteres. Una cadena de caracteres.

char* = puntero a char. Es un puntero que apunta al primer char de tu cadena. Eso no significa que tengas un char. Tienes 10 chars (los 9 del teléfono + 1 del \0 final como tú mismo apuntas) sólo que C no entiende lo que es una cadena (ni C, ni tu ordenador.)

Para ello, C tiene que trabajar con un puntero que apunte al primer carácter de tu cadena, ya que es su única forma de saber que ahí hay AL MENOS un char (de ahí que acabe con \0, es necesario porque indica a C "aquí se ha acabado la cadena, soy el byte 0, por lo tanto soy el último char de la cadena".

Las funciones que trabajan con cadenas no hacen más que recorrer esa serie de caracteres, usando el puntero para situarse al principio de esa cadena y luego aumentando el puntero para acceder al resto de caracteres... hasta que encuentra el char \0 y dicen "hey, vale, aquí se ha acabado".

De hecho piénsalo: cuando defines una cadena, tú no defines un char, sino char[10] por ejemplo. Eso son 10 chars, no un char. Aunque la variable es de tipo char, en realidad es como si tuvieras 10 variables char (char[0], char[1]...) Lo que pasa es que en C no puedes pasar los 10 chars de golpe, por eso sólo pasas la referencia al primero.

1 respuesta
xCoNDoR

#11 Gracias por toda la explicación, te lo agradezco. Y perdona por no haberme expresado bien, confundía terminos.

1 respuesta
elkaoD

#12, no joder, no hace falta pedir perdón :) Me alegro de que te haya quedado claro. Los punteros, según como te los expliquen, pueden ser o muy intuitivos o un infierno xD

Usuarios habituales