Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Contar carateres

Estas en el tema de Contar carateres en el foro de C/C++ en Foros del Web. Estoy estudiando C con el libro "The C Programming Language", la segunda edición especificamente. Y alli se encuentra un ejercicio para contar los caracteres, y ...
  #1 (permalink)  
Antiguo 28/05/2014, 19:50
 
Fecha de Ingreso: mayo-2014
Mensajes: 4
Antigüedad: 10 años
Puntos: 0
Contar carateres

Estoy estudiando C con el libro "The C Programming Language", la segunda edición especificamente. Y alli se encuentra un ejercicio para contar los caracteres, y lo he copiado exactamente igual en el IDE (CodeBlocks), pero no funciona como lo dice el libro. Por qué?

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. /*Conteo de caracteres*/
  4.  
  5. main()
  6. {
  7.     long nc;
  8.  
  9.     nc = 0;
  10.     while(getchar() != EOF)
  11.         ++nc;
  12.     printf("%ld\n", nc);
  13. }

Quizás por los cambios que se han realizado en el estandar C11 ??
Si es así no se donde conseguir la información de este último estandar. He buscado sin éxito.
  #2 (permalink)  
Antiguo 28/05/2014, 20:28
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 11 meses
Puntos: 61
Respuesta: Contar carateres

¿Que dice el libro y que hace el programa?
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 28/05/2014, 20:50
 
Fecha de Ingreso: mayo-2014
Mensajes: 4
Antigüedad: 10 años
Puntos: 0
Respuesta: Contar carateres

Lo que hace el programa es contar la cantidad de caracteres que tiene la palabra que escribas. Es decir, al pedir la entrada, si escribes la palabra "sol" el programa dará una salida diciendo que tiene 3 carateres. Si escribes "tren" dirá que tiene 4 caracteres. El libro explicoa esto haciendo referencia al ejercicio anterior, que copia caracteres de la entrada a la salida, el cual es este:

leer un caracter
while (caracter no es igual a indicador end-of-file)
imprimir el caracter leído
leer caracter

Convirtiendo esto a C, es:

Código C:
Ver original
  1. #include <stdio.h>
  2. /* copy input to output; 1st version */
  3. main()
  4. {
  5. int c;
  6. c = getchar();
  7. while (c != EOF) {
  8. c = getchar();
  9. }
  10. }
  #4 (permalink)  
Antiguo 28/05/2014, 21:07
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 3 meses
Puntos: 5
Respuesta: Contar carateres

hola amigo creo que lo querieres es esto no.

Código C:
Ver original
  1. #include <stdio.h>
  2.      
  3.     /*Conteo de caracteres*/
  4.      
  5.     main()
  6.     {
  7.         long nc;
  8.         char c;
  9.         nc = 0;
  10.         while((c = getchar()) != '\n')
  11.             ++nc;
  12.         printf("%ld\n", nc);
  13.     }

bueno espero haberte ayudado.
Saludos.
Drewermerc.
  #5 (permalink)  
Antiguo 29/05/2014, 00:12
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Contar carateres

c11?? no lo entiendo lo de c11, a lo mejor te refieres a c++11.
Ese código no tiene nada de c++ y menos de c++11 XDD
El EOF quiere decir end of file y no veo que trabajes con archivos.
La versión que te dejo Drewermerc va perfectamente... Contara todo los caracteres hasta que pulses enter.

El EOF es por si leyeras caracteres hasta el fin de algún archivo de texto, pero ese no es el sistema, en algo te equivocas XD
  #6 (permalink)  
Antiguo 29/05/2014, 03:47
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 9 meses
Puntos: 83
Respuesta: Contar carateres

La revision C11 reemplaza la C99.

Una lista de novedades: http://www.open-std.org/jtc1/sc22/wg...2013/n3631.pdf

Referencia del estandar C11: http://www.open-std.org/jtc1/sc22/wg14/www/standards

Otra version de la lista de modificaciones: http://blog.smartbear.com/codereview...r-programming/

Solo es cuestion de googlear C11; hay informacion de sobras, C aun no ha muerto. De todas formas si tu compilador lo soporta puedes indicarle que compile en una version u en otra.

Saludos
vosk
  #7 (permalink)  
Antiguo 29/05/2014, 04:15
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 9 meses
Puntos: 83
Respuesta: Contar carateres

Por cierto EOF en consola de windows es ctrl-z y representa el ascii -1.

Luego el codigo de celtic7 si que funciona siguiendo alguna regla: el getchar estandar requiere enter para saber que terminaste de escribir; sabiendo que getchar solo recupera un caracter a la vez, sabiendo tambien que haces un ciclo para recuperar todos los caracteres, y sabiendo que no puedes concatenar el ctrlz a otros caracteres dentro del buffer de entrada (a menos que ctrl-z sea el primer caracter), el codigo funciona cuando escribes:

Código C:
Ver original
  1. hola
  2. <enter>
  3. <ctrl-z>
  4. <enter>

Obtienes 5 caracteres: 'hola' + <enter>, el ultimo enter para aceptar ctrl-z se queda en el stdin.

Aun asi tal como te comentaron yo tambien prefiero la version de @Drewermerc, donde usa un caracter concatenable como punto final, pero esto solo significa que la funcion del libro es poco amigable, no tiene nada que ver con la revision de C.

Saludos
vosk
  #8 (permalink)  
Antiguo 29/05/2014, 04:31
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Contar carateres

Cita:
ctrl-z
Interesante lo del control+z eso no lo se :D y lo de c11 era otra cosa que no sabia jeje.
Por supuesto que c no va a morir. Es duro como una roca. XD
Ademas es un lenguaje que mientras menos le toquen mejor sera ^^.
  #9 (permalink)  
Antiguo 29/05/2014, 04:53
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 9 meses
Puntos: 83
Respuesta: Contar carateres

@vangodp "...Por supuesto que c no va a morir. Es duro como una roca..."

Estoy de acuerdo :)

Por cierto ctrl-z solo para windows, en linux es ctrl-c o no se que algo asi es cuestion de buscar.

Saludos
vosk
  #10 (permalink)  
Antiguo 29/05/2014, 13:16
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 3 meses
Puntos: 5
Respuesta: Contar carateres

bueno solo agrego que para el final del archivo despues de precionar control+z se preciona enter para que funcione.

y bueno vosk yo uso control+d en linux que yo se par control+c e para terminar procesos ya sea en windows o linux o ati si te funciona como EOF en linux.

Saludos.
Drewermerc.
  #11 (permalink)  
Antiguo 29/05/2014, 16:34
 
Fecha de Ingreso: mayo-2014
Mensajes: 4
Antigüedad: 10 años
Puntos: 0
Respuesta: Contar carateres

Si "Drewermerc", a eso me refería, muchas gracias. Poniendo aún más sencillo el código veo que puede funcionar sin la declaración "char c", y colocando solo "getchar() != '\n'" en el argumento de "while". Así estaría lo más cercano al ejercicio que está propuesto en el libro que estoy estudiando. En pocas palabras la única modificación para que funcione es cambiar "EOF" por "\n" en el argumento de while.

Ya entiendo "vangodp" que el EOF se genera cuando finaliza un archivo de texto. Estaba muy confundido porque en el libro explica este ejercicio sin explicar cómo se usa el getchar para leer una entrada en forma de archivo. O será que cuando el autor escribió el libro, en esos tiempos al presionar ENTER equivalía a un EOF ? O será que el sistema operativo que el autor usaba funcionaba de esa forma? El libro se llama "El Lenguaje de Programación C", segunda y última edición, escrito por Brian Kernighan y Dennis Ritchie. Este libro fue escrito en el año 1988. Todos sabemos que Dennis Ritchie es el padre, creador de este lenguaje. Aquí en este enlace les dejo el fragmento del libro donde se encuentra mi duda, especificamente lo que dice el penúltimo párrafo:

http://paste.ubuntu.com/7547072/

Con respecto a "vosk". No sabía lo de "CTRL + Z", y ciertamente funciona, pero para que me de el resultado correcto el valor de "nc" tendría que ser "-1" para que me ignore el último ciclo que hace por CTRL + Z. Es decir, ya van 2 soluciones, esta segunda es solo modificando en el código el valor de la inicialización de while de "0" a "-1". Ahora que dices que no se puede concatenar el "CTRL + Z" al último carácter, en ese fragmento del libro dice lo siguiente: "No se puede utilizar char puesto que c debe ser suficientemente grande como para mantener a EOF además de cualquier otro carácter. Por lo tanto se emplea int". Entonces ahí vuelvo a lo mismo, el autor (Dennis Ritchie) se está refiriendo solo al uso de getchar con un archivo como entrada, o se está refiriendo a la entrada por teclado? Si la respuesta es esté último, por qué a él el getchar si le generaba un EOF y a mi no? Será por el sistema operativo? O por el tipo de computadora que usaba? O será que estoy nadando en un vaso de agua y ya esto está resuelto?
  #12 (permalink)  
Antiguo 29/05/2014, 17:04
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 3 meses
Puntos: 5
Respuesta: Contar carateres

hola amigo.
bueno pues control+z al ingresarlo el programa lo interpreta como si fuera el EOF y bueno yo creo que tu libro se refiere a el final del archivo pero con un archivo.

para que no te confundas loque puede hacer es crear un archivo .txt con un texto guardarlo en la carpeta donde esta tu programa y lo ejecutas asi.
pero esto debe ser en la terminal (cmd).
programa.exe < texto.txt

y tu programa leera el archivo y te dira cuantos caracteres tiene hasta encontrar el EOF y terminar el programa .

Saludos.
Drewermerc.
  #13 (permalink)  
Antiguo 29/05/2014, 23:30
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Contar carateres

getchar devuelve un EOF al terminar de leer esos char.
¿que es un EOF? Es un entero normalmente negativo pero puede variar de una funcion a otra. Con mis malabras es un algo parecido a return -1;

por si no recuerdas las funciones retornan valores ... y la función getchar() sera algo parecido a eso:
Código C:
Ver original
  1. int getchar(char c){
  2.     //blablabla aqui hace la magia XD
  3.     return -1;  //<-eso es el EOF
  4. }

...y solo lo retorna si se ha terminado los datos... ¿como lo hace?Pues mas o menos así:

Código C:
Ver original
  1. int getchar(char c){
  2.     if( si existe chars ){
  3.        return c;
  4.     }
  5.      else{
  6.        return -1;
  7.     }
  8. }

Pero en realidad el return lo hará así:

return EOF;

¿Y como lo se? Por que soy Dennis Richards? jajaj es broma

...porque ese valor se puede imprimir. Esta definido dentro de stdio.h y se puede modificar haciendo un #define EOF <otroNumero>.

Te voy enseñar 2 ejemplos, en ambos vamos imprimir el EOF y así ya se te va quitar las dudas :D

El primero ejemplo va imprimir el EOF por defecto, y el segundo va imprimir un EOF modificado por nosotros. En ambos casos lo que quiero demostrar es el valor que tiene.
Es como la constante PI que esta definida dentro de la librería math.h, se puede cambiar, por que por ejemplo PI viene definida asi: PI == 3.141231241542543523634254124º11º3º131º1 XDDDDDDDDDDD.......

Y que pasa si no lo quiero tannn largo... pues que hago un #define PI 3.14 y ya ta XD

Aquí va el primer XD
Código C:
Ver original
  1. #include <stdio.h>  // printf()
  2.  
  3. int main(void){
  4.   getchar();
  5.   printf("EOF == %d\n", EOF);
  6.  
  7.   return 0;
  8. }

como puedes ver es -1 creo XD (puede variar de un compilador a otro, yo uso mingw)

El otro ejemplo modificamos el EOF para que sea 10 enves de -1 pero recuerda que 10 ya existe en la tabla asc2 y por eso se usan negativos... porque no hay valores negativos en dicha tabla, pero me da igual por que no voy usar ese EOF para nada XD.

Código C:
Ver original
  1. #include <stdio.h>  // printf()
  2. #define EOF 10
  3.  
  4. int main(void){
  5.   getchar();
  6.   printf("EOF == %d\n", EOF);
  7.  
  8.   return 0;
  9. }

Bueno pues como puedes ver el EOF es simplemente es una marca que indica que ya no hay mas letras y es cuando rompe tu bucle, y cada función puede dejar una marca distinta. Lo que se intenta es que sea un entero ya que si fuera un char y padentro... XD

Por eso EOF es un entero y no un char.

Ahora volviendo a tu programa... tu bucle no se rompe mientras getchar no arroje el EOF (-1) que es esto while ( getchar() != EOF) o lo que es lo mismo while (getchar() != -1)
Prueba lo :D

Si me liado en algo no me peguéis , es solo corregidme y aprenderé también

Espero que sirva para la duda y ¡Suerte!

Etiquetas: funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:15.