Ayudita con una funcion que estoy haciendo
Estoy haciendo una funcion que recibe un string y un atributo a buscar dentro del string y obtenga los datos seguidos a estos atributos...
Por ejemplo;
recibe esta cadena:
int main;
supuestamente la funcion me deberia devolver main, pero me devuelve solo m... la verdad que no se que error puede tener... no lo ecuentro.. Gracias por la ayuda..
*char analizostring (char *stringquerecibo, char *atributoabuscar, char *dondeguardo){
char *pos; /*Posicion dentro del string*/
if ((pos = strstr (stringquerecibo, atributoabuscar)) == NULL){
return 0;
}
pos += strlen (atributoabuscar);
if (*pos != 'n'){
if (*pos != ('{' || '}' || ';' || ')' || '(' )){
*(dondeguardo++) = *(pos++);
} else {
*dondeguardo= ' ';
}
}
return 1;
}
Gracias por su ayuda..
Por ejemplo;
recibe esta cadena:
int main;
supuestamente la funcion me deberia devolver main, pero me devuelve solo m... la verdad que no se que error puede tener... no lo ecuentro.. Gracias por la ayuda..
*char analizostring (char *stringquerecibo, char *atributoabuscar, char *dondeguardo){
char *pos; /*Posicion dentro del string*/
if ((pos = strstr (stringquerecibo, atributoabuscar)) == NULL){
return 0;
}
pos += strlen (atributoabuscar);
if (*pos != 'n'){
if (*pos != ('{' || '}' || ';' || ')' || '(' )){
*(dondeguardo++) = *(pos++);
} else {
*dondeguardo= ' ';
}
}
return 1;
}
Gracias por su ayuda..
Hola Non C master!
Si me lo permites, primero voy a tratar de explicar por qué tu código no funciona:
1. Supongo que cuando dices:
*char analizostring (char *stringquerecibo, char *atributoabuscar, char *dondeguardo) ...
el "*" de adelante está de más y se debe tratar de un error de tipeo, así que no cuenta.
2. if (*pos != 'n'){
En tu segundo mensaje aclaras que está de más, así que tampoco cuenta.
3. if (*pos != ('{' || '}' || ';' || ')' || '(' )){
Aquí sí hay algo extraño:
Cuando dices ( '{' || '}' || ';' || ')' || '(' ) , la expresión '{' || '}' se evalúa siempre a "true", y lo mismo con toda la secuencia dentro del par de paréntesis. Pero, como un valor "true" es cualquier entero distinto de cero, entonces en general la comparación
if (*pos != ('{' || '}' || ';' || ')' || '(' ))
se evaluará la mayoría de las veces como "true", aunque si ejecutas este código varias veces más, en algún momento resultará "false". En este caso, la función saldrá devolviendo un 1, aunque no se haya puesto nada en "dondeguardo".
Pero supongamos que efectivamente sí se ejecuta ese bloque de código, como debe suceder en la mayoría de las veces, entonces:
4. El bloque de código:
if (*pos != ('{' || '}' || ';' || ')' || '(' )){
*(dondeguardo++) = *(pos++);
} else {
*dondeguardo= ' ';
}
se ejecutará una sola vez ya que no está dentro de un ciclo que diga lo contrario. Y en el caso en que la cadena stringquerecibo sea "int main;", y la cadena atributoabuscar sea "int ", este bloque de código efectivamente pondrá 'm' en dondeguardo[0] y saldrá devolviendo 1.
Bien, ¿y entonces?
char analizostring (char *stringquerecibo, char *atributoabuscar, char *dondeguardo){
char *pos; /*Posicion dentro del string*/
if ((pos = strstr (stringquerecibo, atributoabuscar)) == NULL){
return 0;
}
pos += strlen (atributoabuscar);
for ( ; *pos != 'n'; ) {
if (*pos != '{' || *pos != '}' || *pos != ';' || *pos != '(' || *pos != ')' ){
*(dondeguardo++) = *(pos++);
} else {
*dondeguardo= ' ';
}
}
return 1;
}
Espero que te sea útil,
Alejandro
Si me lo permites, primero voy a tratar de explicar por qué tu código no funciona:
1. Supongo que cuando dices:
*char analizostring (char *stringquerecibo, char *atributoabuscar, char *dondeguardo) ...
el "*" de adelante está de más y se debe tratar de un error de tipeo, así que no cuenta.
2. if (*pos != 'n'){
En tu segundo mensaje aclaras que está de más, así que tampoco cuenta.
3. if (*pos != ('{' || '}' || ';' || ')' || '(' )){
Aquí sí hay algo extraño:
Cuando dices ( '{' || '}' || ';' || ')' || '(' ) , la expresión '{' || '}' se evalúa siempre a "true", y lo mismo con toda la secuencia dentro del par de paréntesis. Pero, como un valor "true" es cualquier entero distinto de cero, entonces en general la comparación
if (*pos != ('{' || '}' || ';' || ')' || '(' ))
se evaluará la mayoría de las veces como "true", aunque si ejecutas este código varias veces más, en algún momento resultará "false". En este caso, la función saldrá devolviendo un 1, aunque no se haya puesto nada en "dondeguardo".
Pero supongamos que efectivamente sí se ejecuta ese bloque de código, como debe suceder en la mayoría de las veces, entonces:
4. El bloque de código:
if (*pos != ('{' || '}' || ';' || ')' || '(' )){
*(dondeguardo++) = *(pos++);
} else {
*dondeguardo= ' ';
}
se ejecutará una sola vez ya que no está dentro de un ciclo que diga lo contrario. Y en el caso en que la cadena stringquerecibo sea "int main;", y la cadena atributoabuscar sea "int ", este bloque de código efectivamente pondrá 'm' en dondeguardo[0] y saldrá devolviendo 1.
Bien, ¿y entonces?
char analizostring (char *stringquerecibo, char *atributoabuscar, char *dondeguardo){
char *pos; /*Posicion dentro del string*/
if ((pos = strstr (stringquerecibo, atributoabuscar)) == NULL){
return 0;
}
pos += strlen (atributoabuscar);
for ( ; *pos != 'n'; ) {
if (*pos != '{' || *pos != '}' || *pos != ';' || *pos != '(' || *pos != ')' ){
*(dondeguardo++) = *(pos++);
} else {
*dondeguardo= ' ';
}
}
return 1;
}
Espero que te sea útil,
Alejandro
Perdón, deonde dice:
for ( ; *pos != 'n'; ) {
debiera decir
for ( ; *pos != ' '; ) {
ya que lo que se busca es el terminador nulo de la cadena atributoabuscar
Alejandro
for ( ; *pos != 'n'; ) {
debiera decir
for ( ; *pos != ' '; ) {
ya que lo que se busca es el terminador nulo de la cadena atributoabuscar
Alejandro
Hola, primero que nada Alejandro queria agracederte por la ayuda que me haz dado.. pero solo que me sigue sin funcionar, yo ya habia intentado algo similar con un while(*pos != ' ')
que es practicamente igual..
al hacer esto me imprime el main; !@#! y basura a continuacion :(
No se que hacer... :(
que es practicamente igual..
al hacer esto me imprime el main; !@#! y basura a continuacion :(
No se que hacer... :(
En dondeguardo metes el primer caracter después del atributo a buscar y luego le pones un . El resultado es el que obtienes, solo te guarda la primera letra, la m
Si quieres todas, deberías hacer un bucle hasta que encuentres alguno de esos caracteres especiales (retorno de carro, espacio, etc) guardando todas las letras hasta llegar ahí.
Se bueno
Si quieres todas, deberías hacer un bucle hasta que encuentres alguno de esos caracteres especiales (retorno de carro, espacio, etc) guardando todas las letras hasta llegar ahí.
Se bueno
