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


 


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  ¿Printf y scanf en funciones?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Printf y scanf en funciones?  (Leído 1,934 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 479



Ver Perfil WWW
¿Printf y scanf en funciones?
« en: 11 Febrero 2012, 18:30 »

Hola.

Leí hace tiempo en Internet que no se debía usar printf y scanf en funciones. Sin embargo, muchas veces veo códigos que los llevan.

Entonces, ¿es correcto usar printf y scanf en funciones?

Gracias.

Saludos.


« Última modificación: 11 Febrero 2012, 18:32 por DickGumshoe » En línea

mDrinky


Desconectado Desconectado

Mensajes: 432



Ver Perfil WWW
Re: ¿Printf y scanf en funciones?
« Respuesta #1 en: 11 Febrero 2012, 18:34 »

Claro que es correcto, lo que no es correcto es usarlo de forma incorrecta :P

PD: que traba lenguas xD



En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 479



Ver Perfil WWW
Re: ¿Printf y scanf en funciones?
« Respuesta #2 en: 11 Febrero 2012, 18:38 »

Ah, gracias por la respuesta.

No sé cómo pude ver tres o cuatro páginas en las que ponía eso. Me extrañó bastante, por eso lo he preguntado.

Saludos.
En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: ¿Printf y scanf en funciones?
« Respuesta #3 en: 11 Febrero 2012, 20:21 »

Te recomiendo que leas esto: http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Saludos
En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 479



Ver Perfil WWW
Re: ¿Printf y scanf en funciones?
« Respuesta #4 en: 11 Febrero 2012, 20:25 »

Gracias por el link. Lo leí hace tiempo, pero no viene nada de eso, ¿no?

Saludos.
En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: ¿Printf y scanf en funciones?
« Respuesta #5 en: 11 Febrero 2012, 20:36 »

En el numeral 1 y 2 hacen mención a dichas funciones, además de enlazar a otros links donde también se toca el tema.

Saludos
En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.182


I'Love...!¡.


Ver Perfil WWW
Re: ¿Printf y scanf en funciones?
« Respuesta #6 en: 11 Febrero 2012, 23:27 »

lo ideal es que tus funciones que realicen un proceso X retornen códigos de error para que funciones madres por ejemplo main sepa que hacer ante mas de 1 o 2 situaciones. se puede usar de una manera pero seria con fprintf() en conjunto a Standard error stream (stderr) solamente para debugear y mostrar los errores, pero que solo una persona especializada (en este caso tu) sepas que a ocurrido y el usuario normal solo se preocupe en su funcionamiento y no en codigo o errores que a final de cuentas a el no le interesan... un ejemplo:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>   //<stdio.h>
  3. #include <string.h>
  4.  
  5. char* readInput(FILE* FileSrc)
  6. //  Retorna un puntero a una cadena ansi que debera ser liberada con free();
  7. {
  8.    char c = 0;
  9.    char *szRet = NULL;
  10.    size_t size = 0;
  11.  
  12.    while(++size)
  13.    {
  14.        szRet = (char*)realloc(szRet, size);
  15.        fread(&c, 1, 1, FileSrc);
  16.        if (c == '\n')
  17.            break;  //  exit while(1)
  18.        szRet[size - 1] = c;
  19.    }
  20.    return szRet;
  21. }
  22.  
  23. long int getActionFromString(const char *szStr)
  24. //  Verifica la existencia de vocales dentro de una cadena dada.
  25. {
  26.    long int lFlags = 0;
  27.    if (szStr)
  28.    {
  29.        do
  30.        {
  31.            switch(*szStr) // <-- en luigar de poner los printf usamos flags para saber que hacer en un proceso que nos llamo...
  32.            {
  33.                case 'A':case 'a': lFlags |= 0x1;
  34.                break;
  35.                case 'E':case 'e': lFlags |= 0x2;
  36.                break;
  37.                case 'I':case 'i': lFlags |= 0x4;
  38.                break;
  39.                case 'O':case 'o': lFlags |= 0x8;
  40.                break;
  41.                case 'U':case 'u': lFlags |= 0x10;
  42.                break;
  43.            }
  44.        } while (*(++szStr) != '\0');
  45.    }
  46.    return lFlags;
  47. }
  48.  
  49. int main()
  50. {
  51.   // claro evita poner mucho codigo tambien en el main()... evita esto que hice.
  52.    char* szTmp = NULL;
  53.    long int lFlags = 0;
  54.  
  55.    puts("ingresa una cadena:");
  56.    szTmp = readInput(stdin);
  57.    lFlags = getActionFromString(szTmp);
  58.  
  59.    if (lFlags == 0x0)
  60.    {
  61.        fprintf(stdout, "Cadena limpia de vocales\n");
  62.    } else {
  63.        fprintf(stdout, "Error cadena con vocales\n");
  64.        if (lFlags & 0x1)
  65.            fprintf(stderr, "Error Contiene la vocal \"a\" code: %d\n", lFlags);
  66.        if (lFlags & 0x2)
  67.            fprintf(stderr, "Error Contiene la vocal \"e\" code: %d\n", lFlags);
  68.        if (lFlags & 0x4)
  69.            fprintf(stderr, "Error Contiene la vocal \"i\" code: %d\n", lFlags);
  70.        if (lFlags & 0x8)
  71.            fprintf(stderr, "Error Contiene la vocal \"o\" code: %d\n", lFlags);
  72.        if (lFlags & 0x10)
  73.            fprintf(stderr, "Error Contiene la vocal \"u\" code: %d\n", lFlags);
  74.    }
  75.  
  76.    free(szTmp);
  77.  
  78.    return EXIT_SUCCESS;
  79. }
  80.  

Dulces Lunas!¡.
« Última modificación: 11 Febrero 2012, 23:39 por BlackZeroX (Astaroth) » En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
DickGumshoe


Desconectado Desconectado

Mensajes: 479



Ver Perfil WWW
Re: ¿Printf y scanf en funciones?
« Respuesta #7 en: 11 Febrero 2012, 23:58 »

Muchas gracias por la aclaración, BlackZeroX (Astaroth). Ya me ha quedado claro.
En línea

theluigy13etv

Desconectado Desconectado

Mensajes: 158


Primero se hace, después se mejora


Ver Perfil
Re: ¿Printf y scanf en funciones?
« Respuesta #8 en: 12 Febrero 2012, 05:36 »

 :huh: :huh: :huh: :huh: :huh: :huh:

Citar
lo ideal es que tus funciones que realicen un proceso X retornen códigos de error para que funciones madres por ejemplo main sepa que hacer ante mas de 1 o 2 situaciones. se puede usar de una manera pero seria con fprintf() en conjunto a Standard error stream (stderr) solamente para debugear y mostrar los errores, pero que solo una persona especializada (en este caso tu) sepas que a ocurrido y el usuario normal solo se preocupe en su funcionamiento y no en codigo o errores que a final de cuentas a el no le interesan... un ejemplo:

Código
#include <stdlib.h>
#include <stdio.h>   //<stdio.h>
#include <string.h>
 
char* readInput(FILE* FileSrc)
//  Retorna un puntero a una cadena ansi que debera ser liberada con free();
{
    char c = 0;
    char *szRet = NULL;
    size_t size = 0;
 
    while(++size)
    {
        szRet = (char*)realloc(szRet, size);
        fread(&c, 1, 1, FileSrc);
        if (c == '\n')
            break;  //  exit while(1)
        szRet[size - 1] = c;
    }
    return szRet;
}
 
long int getActionFromString(const char *szStr)
//  Verifica la existencia de vocales dentro de una cadena dada.
{
    long int lFlags = 0;
    if (szStr)
    {
        do
        {
            switch(*szStr) // <-- en luigar de poner los printf usamos flags para saber que hacer en un proceso que nos llamo...
            {
                case 'A':case 'a': lFlags |= 0x1;
                break;
                case 'E':case 'e': lFlags |= 0x2;
                break;
                case 'I':case 'i': lFlags |= 0x4;
                break;
                case 'O':case 'o': lFlags |= 0x8;
                break;
                case 'U':case 'u': lFlags |= 0x10;
                break;
            }
        } while (*(++szStr) != '\0');
    }
    return lFlags;
}
 
int main()
{
   // claro evita poner mucho codigo tambien en el main()... evita esto que hice.
    char* szTmp = NULL;
    long int lFlags = 0;
 
    puts("ingresa una cadena:");
    szTmp = readInput(stdin);
    lFlags = getActionFromString(szTmp);
 
    if (lFlags == 0x0)
    {
        fprintf(stdout, "Cadena limpia de vocales\n");
    } else {
        fprintf(stdout, "Error cadena con vocales\n");
        if (lFlags & 0x1)
            fprintf(stderr, "Error Contiene la vocal \"a\" code: %d\n", lFlags);
        if (lFlags & 0x2)
            fprintf(stderr, "Error Contiene la vocal \"e\" code: %d\n", lFlags);
        if (lFlags & 0x4)
            fprintf(stderr, "Error Contiene la vocal \"i\" code: %d\n", lFlags);
        if (lFlags & 0x8)
            fprintf(stderr, "Error Contiene la vocal \"o\" code: %d\n", lFlags);
        if (lFlags & 0x10)
            fprintf(stderr, "Error Contiene la vocal \"u\" code: %d\n", lFlags);
    }
 
    free(szTmp);
 
    return EXIT_SUCCESS;
}
 

Dulces Lunas!¡.

La verdad que me mareé con esta respuesta. En mi humilde opinión te puedo decir que la razón por la que los libros dicen que es incorrecto usar printf y scanf en funciones, se debe a puros formalismos. (Corrección: Se debe en parte a la formalidad en el uso de una función)Porque, si se trata de una función que devuelve un único valor ya sea int, char, bool, o algún otro tipo que no sea void, lo correcto sería que a esta función se le proporcione toda la información de entrada mediante sus parámetros. Osea, en la llamada a la función, la unidad (programa principal o algún subprograma) que llama a la función debe pasarle toda la información necesaria mediante la lista de argumentos (y así se evita pedir más información mediante scanf) para que trabaje con ellos y luego, una vez procesados, devuelva algún resultado mediante la setencia return (y ya no con la función printf). Ya que este debería ser el uso que se le debería dar a una función de manera legal, formal y correcta.

Cuando se trata de funciones que devuelve el tipo void ya es muy diferente, porque en realidad, estas ya no son funciones propiamente dichas sino que se tratarían de procedimientos. Generalmente en los procedimientos (funciones que retornan el tipo void) se vería no tan mal el uso de printf y scanf. Esa es mi opinión.
« Última modificación: 12 Febrero 2012, 16:22 por theluigy13etv » En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.182


I'Love...!¡.


Ver Perfil WWW
Re: ¿Printf y scanf en funciones?
« Respuesta #9 en: 12 Febrero 2012, 05:48 »

@theluigy13etv

Se te agradecerá cuando cites algo importante sin citar de manera tan impulsiva un post, ahora mi ejemplo es exactamente lo que dices sobre return y el uso de printf(); es decir retornar errores pero en códigos, o llamadas a CallBacks que traten el error producido en una función. esto de usar scanf y printf no solo tiene que ver con formalismos, de hecho se hace mas legible un codigo a la hora de leer (claro deberás tener una documentación de los códigos de errores).

Dulces Lunas!¡.
En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
theluigy13etv

Desconectado Desconectado

Mensajes: 158


Primero se hace, después se mejora


Ver Perfil
Re: ¿Printf y scanf en funciones?
« Respuesta #10 en: 12 Febrero 2012, 16:11 »

BlackZeroX (Astaroth) No quise ofenderte amigo (si es que lo hice, disculpas. Solo dije que me mareé con tu código no porque esté desordenado sino porque el que aún no tiene los recursos suficientes como para entender soy yo, pero voy a documentarme más respecto a las cosas que mencionas en tu comentario, sobre debugger y stderr, etc). Me podrías explicar que quieres decir con esto:
Citar
Se te agradecerá cuando cites algo importante sin citar de manera tan impulsiva un post
) ).
Yo solo puse mi opinión respecto al mal uso de funciones printf y scanf en funciones, no digo que tengo toda la razón:
Citar
En mi humilde opinión
....
Citar
Esa es mi opinión......
. Pero creo que en algo puedo aportar. Y sí, como tú dices, estoy totalmente de acuerdo con esto:
Citar
esto de usar scanf y printf no solo tiene que ver con formalismos, de hecho se hace mas legible un codigo a la hora de leer
« Última modificación: 12 Febrero 2012, 16:16 por theluigy13etv » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.348


Ver Perfil
Re: ¿Printf y scanf en funciones?
« Respuesta #11 en: 14 Febrero 2012, 18:19 »

Me podrías explicar que quieres decir con esto ...
El comentario de BlackZeroX (Astaroth) va en el sentido de, si se responde (como en tu caso) a un mensaje considerando este en su totalidad, no tiene caso citarlo.

En el caso del lenguaje C no se puede (ni es deseable) abstraer de ese modo las funciones. Por supuesto en un caso ideal cada función debe realizar una única operación pero hasta ahí.

Y aun cuando fuera posible estaríamos ante una regla general con excepciones y eso ya es un mal comienzo: la función principal si puede llamar a funciones para el proceso de entrada/salida pero las demás no.

También esta el problema de una función cuyo único objetivo sea reducir el programa al realizar esta el proceso relacionado con la entrada/salida ...

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:  

Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines