Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jrlens en 29 Agosto 2014, 20:09 pm



Título: Problema al ejecutar programas
Publicado por: Jrlens en 29 Agosto 2014, 20:09 pm
Hola a todxs, el caso es que me vi sumergido en un programa complejo que al ejecutarlo no funcionaba bien pero estaba bien escrito (porque era de un libro). Así que pensé que algo iba mal con el IDE y probe con un programa sencillo en el que usara alguna función de entrada tipo fgets(). Por ejemplo este:

#include <stdio.h>
#include <string.h>

char tracks[][80] = {
"I left my heart in Harvard Med School",
"Newark, Newark - a wonderful town",
"Dancing with a Dork",
"From here to maternity",
"The girl from Iwo Jima",
};
void find_track(char search_for[])
{
int i;
for (i = 0; i < 5; i++) {
if (strstr(tracks, search_for))
printf("Track %i: '%s'\n", i, tracks);
}
}
int main()
{
char search_for[80];
printf("Search for: ");
fflush(stdout);
fgets(search_for, 80, stdin);
find_track(search_for);
return 0;
}

El programa busca texto en el array de string e imprime el titulo de la canción si coincide algún término, lo ejecuto, me pide que inserte una palabra y cuando le doy a intro se termina de ejecutar pero no imprime nada. He probado con un compilador Online y se ejecuta perfectamente. ¿Tenéis alguna idea de qué pueda pasar?

P.D:He probado tanto en windows como en linux, varios IDEs y nada de nada.
Gracias por vuestro tiempo.


Título: Re: Problema al ejecutar programas
Publicado por: engel lex en 29 Agosto 2014, 20:42 pm
procura usar las etiquetas GeSHi al publicar codigo...

recuerda algo cuando tengas un problema compilando normalmente es error de tu codigo, solo un 0.0001% de las veces va a ser error del compilador

aprende a leer los errores...

tu codigo
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. char tracks[][80] = {
  5.    "I left my heart in Harvard Med School",
  6.    "Newark, Newark - a wonderful town",
  7.    "Dancing with a Dork",
  8.    "From here to maternity",
  9.    "The girl from Iwo Jima",
  10. };
  11.  
  12. void find_track(char search_for[]) {
  13.    int i;
  14.    for (i = 0; i < 5; i++) {
  15.        if (strstr(tracks, search_for))
  16.            printf("Track %i: '%s'\n", i, tracks);
  17.    }
  18. }
  19.  
  20. int main() {
  21.    char search_for[80];
  22.    printf("Search for: ");
  23.    fflush(stdout);
  24.    fgets(search_for, 80, stdin);
  25.    find_track(search_for);
  26.    return 0;
  27. }

el error
Citar
main.cpp:15:38: error: cannot convert 'char (*)[80]' to 'const char*' for argument '1' to 'char* strstr(const char*, const char*)'

estás tratando de leer un char[][] como si fuera un char[]

solo tienes que corregir en el for, porque tienes que usar
Código:
tracks[i]

por otro lado se te da un segundo error...
cuando usas fgets te captura el "enter" como un salto de linea (\n)
agregando
Código:
strtok(search_for, "\n");
luego del salto de linea resuelves ese segundo error...

por ultimo un consejo... si tu tracks tuviera 1.000.000 de canciones y tu resultado es solo la primera, el igual recorreria 1.000.000 de posibles soluciones, para evitarlo usa despues del printf
Código:
break;

eso forzará a salir del for o puedes usar
Código:
return;

eso forazará a salir de la funcion


Título: Re: Problema al ejecutar programas
Publicado por: Jrlens en 29 Agosto 2014, 21:04 pm
Perdona me acabo de dar cuenta que el codigo de mi mensaje se ha copiado mal. Este es mi codigo:
Código:
#include <stdio.h>
#include <string.h>


char tracks[][80] = {
"I left my heart in Harvard Med School",
"Newark, Newark - a wonderful town",
"Dancing with a Dork",
"From here to maternity",
"The girl from Iwo Jima",
};
void find_track(char search_for[])
{
int i;
for (i = 0; i < 5; i++) {
if (strstr(tracks[i], search_for))
printf("Track %i: '%s'\n", i, tracks[i]);
}
}
int main()
{
char search_for[80];
printf("Search for: ");
fflush(stdout);
fgets(search_for, 80, stdin);
find_track(search_for);
return 0;
}

Compila perfectamente sin errores y no funciona.

EDITO: el problema era del salto de línea, efectivamente tenías razón. ¿Por qué los compiladores harán eso y en los libros no lo comentan? Que jodienda...

Gracias de nuevo.