elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda EOF
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda EOF  (Leído 2,359 veces)
pedroedlp

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Duda EOF
« en: 8 Abril 2014, 23:30 pm »

bueno, basicamente no entiendo que es lo que hace EOF, les dejo ete programa que en teoria imprime la linea de entrada mas larga, pero yo ejecuto el programa y no hace nada, solo espera q le ingrese datos por teclado, yo creo que es por algo del EOF, que siempre da verdadero el while.

Código:
#include <stdio.h>

#define MAXLINE 1000

int getline(char line[], int maxline);

void copy(char to[], char from[]);

main(){

    int len, max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max=0;

    while ((len=getline(line, MAXLINE) > 0 )){
        if(len > max){
            max = len;
            copy(longest, line);
            }
        }

        if(max > 0){
            printf("%s", longest);
        }


        return 0;


}



int getline(char s[], int lim){

    int c, i;

    for(i=0; i<lim-1 && (c=getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;
    if(c == '\n'){
        s[i] = c;
        ++i;
    }
    s[i] = '\0';

    return i;


}


void copy(char to[], char from[]){

    int i;

    i=0;
    while((to[i] = from[i]) != '\0'){
        ++i;
    }
}




En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda EOF
« Respuesta #1 en: 9 Abril 2014, 03:13 am »

basicamente no entiendo que es lo que hace EOF
Es una macro definida en <stdio.h> con un valor menor que cero (usualmente -1) y es el valor de retorno de algunas funciones de la biblioteca estándar (por ejemplo getchar) para indicar que la operación de lectura fallo al alcanzar el final del archivo.

les dejo ete programa que en teoria imprime la linea de entrada mas larga
Es uno de los ejemplos del libro "The C programming language".

pero yo ejecuto el programa y no hace nada, solo espera q le ingrese datos por teclado, yo creo que es por algo del EOF, que siempre da verdadero el while.
Es el comportamiento normal. Como se procesa la entrada estándar debes introducir varias lineas y a continuación la señal de fin de archivo ({CONTROL} + Z en MS Windows y {CONTROL} + d en Linux). Solo entonces el programa imprimirá la linea mas larga.

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
pedroedlp

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Duda EOF
« Respuesta #2 en: 11 Abril 2014, 03:41 am »

Es una macro definida en <stdio.h> con un valor menor que cero (usualmente -1) y es el valor de retorno de algunas funciones de la biblioteca estándar (por ejemplo getchar) para indicar que la operación de lectura fallo al alcanzar el final del archivo.
Es uno de los ejemplos del libro "The C programming language".
Es el comportamiento normal. Como se procesa la entrada estándar debes introducir varias lineas y a continuación la señal de fin de archivo ({CONTROL} + Z en MS Windows y {CONTROL} + d en Linux). Solo entonces el programa imprimirá la linea mas larga.

Un saludo

yo apreto ctrl + z y no pasa nada, me aparece el ^Z
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda EOF
« Respuesta #3 en: 11 Abril 2014, 05:26 am »

Introduces la combinación de teclas y a continuación presionas la tecla {ENTER}.

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
pedroedlp

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Duda EOF
« Respuesta #4 en: 11 Abril 2014, 19:50 pm »

Introduces la combinación de teclas y a continuación presionas la tecla {ENTER}.

Un saludo

perdon, pero no me funciona
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda EOF
« Respuesta #5 en: 11 Abril 2014, 21:00 pm »

perdon, pero no me funciona

Funcionar, lo que se dice funcionar, funciona. Otra cosa es que los resultados sean los previstos, que no lo son.

Además de declarar main como int inicializo max a cero, que no lo estaba y la salida poniendo un printf justito después del while:


Código
  1. printf("len=%d \n", len);

Citar
123
len=1
12345
len=1
1234567
len=1
12
len=1
^Z
123

Process returned 0 (0x0)


Al parecer la variable len no pilla el retorno de la función, al menos dentro del while ¿?. :huh:

En cambio si la sacamos del while funciona perfecto. Lo he ajustado para que al entrar un enter solitario, sin nada en la linea, se acabe la ejecución sin así tener que recurrir al CTR-Z:


Citar
123
len=4
max=4
12345
len=6
max=6
123456789
len=10
max=10
3215
len=5
32
len=3
1
len=2
 <==ESTO ES UN ENTER SOLITARIO
len=1

Cadena mas larga: 123456789

Process returned 0 (0x0)


Código
  1. #include <stdio.h>
  2.  
  3. #define MAXLINE 1000
  4.  
  5. int getline(char line[], int maxline);
  6.  
  7. void copy(char to[], char from[]);
  8.  
  9. int main(){
  10.    int len=2, max=0;
  11.    char line[MAXLINE];
  12.    char longest[MAXLINE];
  13.    while (len>1){
  14.        len=getline(line, MAXLINE);
  15.        printf("len=%d   ", len);
  16.        if(len > max){
  17.            max = len;
  18.            printf("max=%d\n", max);
  19.            copy(longest, line);
  20.            }
  21.        }
  22.    if(max > 0)
  23.        printf("\nCadena mas larga: %s", longest);
  24.    return 0;
  25. }
  26.  
  27. int getline(char s[], int lim){
  28.    int c, i;
  29.    for(i=0; i<lim-1 && (c=getchar()) != EOF && c != '\n'; ++i)
  30.        s[i] = c;
  31.    if(c == '\n'){
  32.        s[i] = c;
  33.        ++i;
  34.    }
  35.    s[i] = '\0';
  36.    printf("%d\n", i);
  37.    return i;
  38. }
  39.  
  40. void copy(char to[], char from[]){
  41.    int i;
  42.    i=0;
  43.    while((to[i] = from[i]) != '\0'){
  44.        ++i;
  45.    }
  46. }

Aún no le encuentro justificación al comportamiento de len dentro del while. :silbar:

¡¡¡¡ Saluditos! ..... !!!!





En línea

pedroedlp

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Duda EOF
« Respuesta #6 en: 11 Abril 2014, 21:19 pm »

Funcionar, lo que se dice funcionar, funciona. Otra cosa es que los resultados sean los previstos, que no lo son.

Además de declarar main como int inicializo max a cero, que no lo estaba y la salida poniendo un printf justito después del while:


Código
  1. printf("len=%d \n", len);

Al parecer la variable len no pilla el retorno de la función, al menos dentro del while ¿?. :huh:

En cambio si la sacamos del while funciona perfecto. Lo he ajustado para que al entrar un enter solitario, sin nada en la linea, se acabe la ejecución sin así tener que recurrir al CTR-Z:


Código
  1. #include <stdio.h>
  2.  
  3. #define MAXLINE 1000
  4.  
  5. int getline(char line[], int maxline);
  6.  
  7. void copy(char to[], char from[]);
  8.  
  9. int main(){
  10.    int len=2, max=0;
  11.    char line[MAXLINE];
  12.    char longest[MAXLINE];
  13.    while (len>1){
  14.        len=getline(line, MAXLINE);
  15.        printf("len=%d   ", len);
  16.        if(len > max){
  17.            max = len;
  18.            printf("max=%d\n", max);
  19.            copy(longest, line);
  20.            }
  21.        }
  22.    if(max > 0)
  23.        printf("\nCadena mas larga: %s", longest);
  24.    return 0;
  25. }
  26.  
  27. int getline(char s[], int lim){
  28.    int c, i;
  29.    for(i=0; i<lim-1 && (c=getchar()) != EOF && c != '\n'; ++i)
  30.        s[i] = c;
  31.    if(c == '\n'){
  32.        s[i] = c;
  33.        ++i;
  34.    }
  35.    s[i] = '\0';
  36.    printf("%d\n", i);
  37.    return i;
  38. }
  39.  
  40. void copy(char to[], char from[]){
  41.    int i;
  42.    i=0;
  43.    while((to[i] = from[i]) != '\0'){
  44.        ++i;
  45.    }
  46. }

Aún no le encuentro justificación al comportamiento de len dentro del while. :silbar:

¡¡¡¡ Saluditos! ..... !!!!







muchas gracias
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda EOF
« Respuesta #7 en: 11 Abril 2014, 21:25 pm »


muchas gracias


De nada campeón. Y espero que alguien más lucido nos explique el por qué del comportamiento anómalo de len en el while.

¡¡¡¡ Saluditos! ..... !!!!


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda EOF
« Respuesta #8 en: 12 Abril 2014, 16:58 pm »

Funcionar, lo que se dice funcionar, funciona. Otra cosa es que los resultados sean los previstos, que no lo son.

Además de declarar main como int inicializo max a cero, que no lo estaba
A la variable "max" se le asigna el valor cero justo antes del bucle, con ella no hay problema.

El error se encuentra en el bucle while, al copiar el programa se colocaron mal los paréntesis:
Código
  1. while ((len = getline(line, MAXLINE) > 0 )) ...
Para que funcione correctamente basta con cambiarlo a:
Código
  1. /* Primero se asigna el resultado de getline a len y solo entonces se compara */
  2. while ((len = getline(line, MAXLINE)) > 0 ) ...

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pequeña duda con un comando batch (NUEVA DUDA RELACIONADA)
Scripting
revenge1252 9 9,738 Último mensaje 13 Febrero 2008, 21:41 pm
por revenge1252
Duda duda y duda de Metasploit
Bugs y Exploits
huber_nomas 4 5,775 Último mensaje 17 Febrero 2012, 14:00 pm
por MauroMasciar
Duda facil, [VIDEO QUE EXPLICA MI DUDA]
Diseño Gráfico
Ngeooz 6 8,841 Último mensaje 2 Diciembre 2013, 19:33 pm
por Ngeooz
[DUDA] Cambiar letra de unidad a archivo con un Batch [DUDA] « 1 2 »
Windows
MrMaticool 10 11,279 Último mensaje 12 Febrero 2014, 17:55 pm
por MrMaticool
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines