Autor
|
Tema: Comparación de cadenas (Leído 5,858 veces)
|
kaostias
Desconectado
Mensajes: 19
Mi método da menos excepciones ergo es mejor
|
Buenas, este es mi primero mensaje y espero que no el último. Llevo tiempo programando en java y me pasé hace muy poco a c++ y c, por que mi carrera me lo exigía, así que ahora estoy haciendo mi primer módulo para el kernel de un debian 6, Es una práctica para la universidad y se trata de una lista que guarde y borre elementos de proc y en la que, si se modifica un archivo de /proc tiene que reconocerlo y ejecutar el código correspondiente, digamos que se debe añadir un número a la lista, pues el usuario escribirá: echo add 10 > /proc/mymodule. Aún soy muy inexperto con C y tengo un error que seguro es de principiante.
¿Cómo puedo estar seguro de que el formato de una cadena es del tipo: "add 144" o "remove 4"?
Gracias.
|
|
|
En línea
|
- ¡Éste código sin documentar es un galimatías! - Es tuyo, de hace 3 semanas - ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Si el formato de una instrucción es "comando[espacio/s]argumento", existe una función muy chula llamada strchr que permite dividir una cadena de caracteres a partir de un caracter que hace las veces de delimitador... en tu caso el delimitador sería el espacio.
Después de trocear la cadena recorres las subcadenas y lo suyo es que sólo encontrases dos subcadenas... la primera sería el comando y la segunda el argumento.
El algoritmo también te permitirá trabajar con más de un argumento.
La opción 2 consiste en recorrerte a mano la cadena e ir buscando los espacios para delimitar el comando y los argumentos.
|
|
|
En línea
|
|
|
|
kaostias
Desconectado
Mensajes: 19
Mi método da menos excepciones ergo es mejor
|
Un profesor me comentó que existía una macro del tipo
char* str = "add 134";
int aux; strcmp(str, "add %d",aux)
Que devuelve un número igual a 1 si las cadenas son iguales, y guarda en aux el dígito %d, pero por mucho que busco no logro encontrarlo
|
|
« Última modificación: 24 Octubre 2013, 10:26 am por kaostias »
|
En línea
|
- ¡Éste código sin documentar es un galimatías! - Es tuyo, de hace 3 semanas - ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
En C:
Devuelve 0 si las cadenas son iguales.
|
|
|
En línea
|
|
|
|
kaostias
Desconectado
Mensajes: 19
Mi método da menos excepciones ergo es mejor
|
Es cierto, lo que yo quería era encontrar algo de ese tipo (He puesto strcmp por poner algo) que pueda comparar que el formato de la cadena se ajuste a eso "add+número" y me devuelva el número.
|
|
|
En línea
|
- ¡Éste código sin documentar es un galimatías! - Es tuyo, de hace 3 semanas - ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Un profesor me comentó que existía una macro del tipo
char* str = "add 134";
int aux; strcmp(str, "add %d",aux)
Que devuelve un número igual a 1 si las cadenas son iguales, y guarda en aux el dígito %d, pero por mucho que busco no logro encontrarlo
No es una macro, es una función y su uso es tal y como te ha comentado amchacon. Las macros son bastante diferentes a las funciones. Por otro lado no es tan complicado de buscar... tu pon strcmp en google y curiosamente el primer enlace que sale te explica el funcionamiento de dicha función. Por otro lado, strcmp no es capaz de reconocer parámetros ( lo digo por el %d que has plantado ahí )... compara cadenas caracter a caracter. Si quieres que la comparación busque por conceptos más abstractos ( es decir, primero un texto que representa a un comando y después un número ) tendrás que optar por comprobar tu a mano la secuencia... para ello puedes hacer uso de mi primer mensaje. En C:
Devuelve 0 si las cadenas son iguales. Se te olvidaron las comillas strcmp("Cadena 1", "Cadena 2");
Se que lo sabías, el comentario era sobretodo para no liar a terceros.
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Se te olvidaron las comillas
En realidad creo que amchacon puso Cadena 1 refiriendose a una variable, no a una cadena como constante.
|
|
|
En línea
|
|
|
|
kaostias
Desconectado
Mensajes: 19
Mi método da menos excepciones ergo es mejor
|
Gracias a todos. De momento me lo intento apañar con este script, sólo tengo el problema de que atoi no está en kernel, y no sé cómo parsear un entero a dígito en kernel. int reconocedor(char* str, int* dig){ if(strncmp(str, "add ", 4)==1){ *dig = atoi(str[4]); return 1; }else if(strncmp(str,"remove ", 7)==1){ *dig = atoi(str[7]); return 2; }else if(strcmp(str,"cat") == 1) { *dig = -1; return 3; } if(strcmp(str, "sort") == 1) { *dig = -1; return 4; } *dig = -1; return -1; }
|
|
|
En línea
|
- ¡Éste código sin documentar es un galimatías! - Es tuyo, de hace 3 semanas - ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
En realidad creo que amchacon puso Cadena 1 refiriendose a una variable, no a una cadena como constante.
Entonces "técnicamente" tendría que haber eliminado los espacios, no? Gracias a todos. De momento me lo intento apañar con este script, sólo tengo el problema de que atoi no está en kernel, y no sé cómo parsear un entero a dígito en kernel.
Tan "complicado" como recorrer la cadena, reconocer el dígito actual, multiplicar por diez el total acumulado y sumarle el valor del dígito actual al acumulado. int reconocedor(char* str, int* dig){ if(strncmp(str, "add ", 4)==1){ *dig = atoi(str[4]); return 1; }else if(strncmp(str,"remove ", 7)==1){ *dig = atoi(str[7]); return 2; }else if(strcmp(str,"cat") == 1) { *dig = -1; return 3; } if(strcmp(str, "sort") == 1) { *dig = -1; return 4; } *dig = -1; return -1; }
Creo que no tienes demasiado claro lo que estás haciendo... strcmp compara dos cadenas... si ambas son iguales, devuelve cero, en caso contrario devuelve un número distinto de cero... si chequeas strcmp con 1 ya te digo yo que el código no te va a funcionar.
|
|
« Última modificación: 24 Octubre 2013, 15:28 pm por eferion »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
En este caso una alternativa a strcmp es sscanf (prototipo en <stdio.h>) para verificar si coincide la primera palabra y al mismo tiempo extraer el numero entero. Esa función opera de forma similar a scanf pero en lugar de obtener los caracteres de la entrada estándar utiliza la cadena indicada como su primer argumento. Por ejemplo: char linea[ALGUN_VALOR]; int numero; /* ... */ if (sscanf(linea , "add %d", &numero ) == 1){ /* comando add */ }else if (sscanf(linea , "mul %d", &numero ) == 1){ /* comando mul */ }
Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema con comparación de cadenas
Java
|
Debci
|
6
|
5,643
|
25 Agosto 2009, 21:46 pm
por juancho77
|
|
|
comparacion de cadenas
« 1 2 »
Programación C/C++
|
m@o_614
|
10
|
6,778
|
19 Febrero 2012, 18:11 pm
por Sagrini
|
|
|
[Python] Duda con comparacion de cadenas en una lectura de socket
Python
|
Príncipe_Azul
|
2
|
3,304
|
8 Noviembre 2013, 08:39 am
por Príncipe_Azul
|
|
|
Comparación de dos cadenas sin usar ningún tipo de bucle
Programación C/C++
|
geeke
|
2
|
2,128
|
15 Marzo 2015, 20:23 pm
por kutcher
|
|
|
[SOLUCIONADO] Busqueda de comparacion de cadenas con arreglo de estructuras
Programación C/C++
|
dato000
|
7
|
3,821
|
13 Mayo 2015, 20:35 pm
por Blaster
|
|