Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: xkiz ™ en 22 Septiembre 2011, 15:08 pm



Título: duda sobre strstr en c++ (WinApi)
Publicado por: xkiz ™ en 22 Septiembre 2011, 15:08 pm
hola gente, "trabajando" en un proyecto me tope con un problema tal vez un poco tonto pero la verdad, ya mi cabeza esta quemada y la verdad es que no me sale, por lo que vi en cplusplus el ejemplo de uso no es difícil pero me blockie y puf.

bue, estoy armando un menú el cual saco los string de cada ítem desde el recursos, hasta ahí todo bien, el tema es que entre estos string hay uno que es "aaaa & bbb" por ejemplo, contiene un carácter "&" el cual no logro hacer visible entre el texto del menú.
se que estos caracteres como & van antecedidos por el carácter "\" para que sean visibles, pero ese mismo string lo uso como titulo de la ventana.

googleando me tope con este ejemplo strstr (http://www.cplusplus.com/reference/clibrary/cstring/strstr/) y por lo que vi es simple el uso, pero no me sale

Código
  1. TACHAR szTitle[50];
  2. char dumy[30];
  3. char * pch;
  4.  
  5. LoadString(hInst, 10, szTitle, sizeof(szTitle));
  6. pch = strstr (szTitle,"&");
  7. strncpy (pch,"&&",2);
  8.  
  9. AppendMenu(hMenu, MF_GRAYED, 0, dumy);
  10.  

el resultado de eso es "aaaa &bbb".
ya me trabe y necesito ayuda con esto, me pudo.
pls help



Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: naderST en 22 Septiembre 2011, 18:11 pm
A ver si entiendo bien tu resultado debería ser el siguiente:

"aaaa & bbb"

y no:

"aaaa &bbb"


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: xkiz ™ en 22 Septiembre 2011, 18:42 pm
si, osea ese mismo string szTitle lo uso para hacer un WM_SETTEXT y se visualiza bien así como esta en el String Table "aaaa & bbb" pero al pasarlo a un ítem del menú el carácter & se usa para poner el subrayado en una palabra, yo lo que necesito es que aparezca el carácter "&"


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: Lambda en 22 Septiembre 2011, 18:45 pm
Prueba ponerlo duplicado "Texto && Mas Texto"


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: xkiz ™ en 22 Septiembre 2011, 19:19 pm
si podría ponerlo así, pero después entro en el mismo problema a la inversa, por que en el menú me queda bien, pero en la barra de titulo [SendMessage(hWnd, WM_SETTEXT,0, (LPARAM)dumy);] me queda con 2 "&", y para complicarmela un poco mas ese mismo texto lo tengo de tooltip del systry.
si le pongo "aaaa &&& bbb" tendría que restarle "&&" a donde le hago WM_SETTEXT...

me metí en un quilombo innecesario al cuete, help!


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: naderST en 22 Septiembre 2011, 19:47 pm
Podrías hacer lo siguiente dejarlo como lo tenías en un principio y hacer una función strreplace como la de php no se si sabes como es, y reemplazas el & por && cuando vayas a asignarle el texto al menú y listo.


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: xkiz ™ en 22 Septiembre 2011, 20:27 pm
es lo que trato de hacer pero no me sale, osea en si tengo que hacer esto, sea para sumar & o bien para sacar & exedentes, e tema es que no se k procedimiento usar para esto, yo puse strstr por que es lo 1º que se me ocurrio, pero escucho sugerencias.


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: naderST en 22 Septiembre 2011, 20:29 pm
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. char *strreplace(const char * str, const char * find, const char * replace){
  6. int i,j,k, flag, pos = -1;
  7. int bytes = strlen(str)-strlen(find)+strlen(replace);
  8. char * nstr = (char*)malloc(bytes+1);
  9. memset(nstr, 0, bytes+1);
  10.  
  11. for(i = 0; i <= strlen(str)-strlen(find); i++){
  12. flag = i;
  13. k = 0;
  14. for(j=i; j<=(i+strlen(find)-1); j++){
  15. if(find[k] != str[j])
  16. flag = -1;
  17. k++;
  18. }
  19.  
  20. if(flag != -1)
  21. pos = flag;
  22. }
  23.  
  24.    int size = pos + strlen(replace) - 1;
  25.    int oldsize = pos + strlen(find);
  26. int cont = 0;
  27. j = 0;
  28.  
  29.    for(i=0;i<=bytes-1;i++){
  30.        if(i>=pos && i<=size){
  31.            nstr[i] = replace[cont];
  32.            cont++;
  33.            if(i==size)
  34.                j=oldsize;
  35.        } else {
  36.            nstr[i] = str[j];
  37.            j++;
  38.        }
  39.    }
  40.  
  41. return nstr;
  42. }
  43.  
  44. int main(){
  45. char * reemplazo = strreplace("Texto & texto", "&", "&&");
  46. printf("%s\n" ,reemplazo);
  47. free(reemplazo);
  48.  
  49. return 0;
  50. }
  51.  

Fíjate si mi función de strreplace te funciona...


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: xkiz ™ en 23 Septiembre 2011, 00:25 am
la verdad si me sirvió, ahora tengo que analizar lo que hacer para ver si logro entender la lógica.


gracias


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: Karman en 23 Septiembre 2011, 05:05 am
bue, estoy armando un menú el cual saco los string de cada ítem desde el recursos, hasta ahí todo bien, el tema es que entre estos string hay uno que es "aaaa & bbb" por ejemplo, contiene un carácter "&" el cual no logro hacer visible entre el texto del menú.
se que estos caracteres como & van antecedidos por el carácter "\" para que sean visibles, pero ese mismo string lo uso como titulo de la ventana.

quien te dijo que tenes que agregarle "\" ? el caracter "&" no tiene nada especial... si no te aparece subrayado debe ser por otra cosa y con respecto a tu ejemplo:

Citar
"aaaa & bbb"

eso no va a funcionar por el espacio en blanco... a lo sumo "aaaa &bbb".

esta es la función encargada de dibujar los strings en los menús: DrawTextEx (http://msdn.microsoft.com/en-us/library/dd162499%28v=vs.85%29.aspx)

fijate la parte de DT_PREFIXONLY

S2


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: xkiz ™ en 23 Septiembre 2011, 16:57 pm
mmmm.... tal vez me explique mal yo desde el principio, yo tengo  un String Table:
Código
  1. STRINGTABLE DISCARDABLE
  2. BEGIN
  3.    101                     "Rock & Pop"
  4. END
  5.  

la cual necesito cargarla en la barra de Titulo de una ventana, un item de un PopUpMenu y un Tooltip, como se ve en la imagen de aca abajo.

(http://www.mediafire.com/imgbnc.php/c56835fff7bc13cf285e9a07dcb4dff98041e207107c285bc7adb039a9b42e422g.jpg) (http://www.mediafire.com/imageview.php?quickkey=9be7tg5x83q9pol&thumb=5)
Link(imagen): http://www.mediafire.com/imageview.php?quickkey=9be7tg5x83q9pol&thumb=5
si en el rc yo pongo "Rock &&& Pop" en el tooltip y en el item del menú se ven bien pero en la barra de titulo  se visualizan los 3 &.
quien te dijo que tenes que agregarle "\" ? el caracter "&" no tiene nada especial
tampoco es un carácter normal como es la "a".

la funcion que me paso naderST funciona bien, pero no se por que me crashea la aplicación, no encontré bien por que todavía, después la voy a debugear bien.


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: Karman en 23 Septiembre 2011, 16:59 pm
mmmm.... tal vez me explique mal yo desde el principio, yo tengo  un String Table:
Código
  1. STRINGTABLE DISCARDABLE
  2. BEGIN
  3.    101                     "Rock & Pop"
  4. END
  5.  

la cual necesito cargarla en la barra de Titulo de una ventana, un item de un PopUpMenu y un Tooltip, como se ve en la imagen de aca abajo.

(http://www.mediafire.com/imgbnc.php/c56835fff7bc13cf285e9a07dcb4dff98041e207107c285bc7adb039a9b42e422g.jpg) (http://www.mediafire.com/imageview.php?quickkey=9be7tg5x83q9pol&thumb=5)

y porqué directamente no modificas tu stringtable(?)

S2


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: xkiz ™ en 23 Septiembre 2011, 17:48 pm
a perdón me olvide de comentar esto antes:
@naderST al compilar la aplicación me dice esto:
Citar
warning C4018: '<=' : signed/unsigned mismatch
Código
  1. for(j=i; j<=(i+strlen(find)-1); j++){
  2.  

si la declaro antes:

Código
  1. int z = i+strlen(find)-1;
  2. for(j=i; j<=z; j++){
  3.  

ah si me crashea mal....

@Karman lo que no quiero hacer es tener que meter 2 strings 1 para el titulo y otro para el tooltip y el ítem del menú, me la quiero arreglar con solo uno, y si a ese string table le agrego los 3 & estoy en la mismo pero al revés, envés de sumar restar, me explico?


Título: Re: duda sobre strstr en c++ (WinApi)
Publicado por: naderST en 23 Septiembre 2011, 18:21 pm
Bueno supongo que esto pasa porque strlen() devuelve unsigned int y lo estoy asignando a variables tipo int... Aquí lo modifiqué:

Código
  1. char *strreplace(const char * str, const char * find, const char * replace){
  2. unsigned int i,j,k,pos, val, size, oldsize, cont;
  3. unsigned int bytes = strlen(str)-strlen(find)+strlen(replace);
  4. int flag;
  5.  
  6. char * nstr = (char*)malloc(bytes+1);
  7. memset(nstr, 0, bytes+1);
  8.  
  9. for(i = 0; i <= strlen(str)-strlen(find); i++){
  10. flag = 1;
  11. val = i;
  12. k = 0;
  13. // unsigned int z = (i+strlen(find)-1);
  14. for(j=i; j<=(i+strlen(find)-1); j++){
  15. if(find[k] != str[j])
  16. flag = 0;
  17. k++;
  18. }
  19.  
  20. if(flag != 0)
  21. pos = val;
  22. }
  23.  
  24.    size = pos + strlen(replace) - 1;
  25.    oldsize = pos + strlen(find);
  26. cont = 0;
  27. j = 0;
  28.  
  29.    for(i=0;i<=bytes-1;i++){
  30.        if(i>=pos && i<=size){
  31.            nstr[i] = replace[cont];
  32.            cont++;
  33.            if(i==size)
  34.                j=oldsize;
  35.        } else {
  36.            nstr[i] = str[j];
  37.            j++;
  38.        }
  39.    }
  40.  
  41. return nstr;
  42. }