Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sinatra en 29 Septiembre 2012, 19:30 pm



Título: ¿ Como utilizar %n ?
Publicado por: sinatra en 29 Septiembre 2012, 19:30 pm
Hola, me pueden ayudar a utilizar el especificador de formato %n, he buscado en google, pero solo dicen como utilizar otros especificadores de formato, y no %n

De antemano gracias

Saludos.


Título: Re: ¿ Como utilizar %n ?
Publicado por: Caster en 29 Septiembre 2012, 19:52 pm
No lee nada. Mira este link:

http://beej.us/guide/bgc/output/html/multipage/scanf.html

Saludos.

EDITO: Te dejo aqui un ejemplo para que veas como funciona:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5. int x;
  6. char linea[] = "hola";
  7.  
  8. scanf("%n", &x);
  9. printf("%s\n", linea);
  10.        getchar();
  11.  
  12. return 0;
  13. }

En este codigo se tendria que pedir primero que se ingrasase un entero, pero como el espefificador es "%n" se salta el scanf, y pasa directamente a escribir "hola".

Saludos


Título: Re: ¿ Como utilizar %n ?
Publicado por: sinatra en 29 Septiembre 2012, 20:24 pm
Pero está relacionado con la salida por printf().
En la pagina anterior del lick que me enviaste dice como utilizarlo, ademas pone un ejemplo, pero me parece que el ejemplo no esta bien.

El ejemplo es el siguinte:

Código
  1. int numChars;
  2. float a = 3.14159;
  3. int b = 3490;
  4.  
  5. printf("%f %d%n\n", a, b, &numChars);
  6. printf("The above line contains %d characters.\n", numChars);

Si puedes arreglarlo...gracias.

Ademas tengo una definicion de un libro que habla de la salida por printf() y dice:

%n   :    El argumento asosiado es un putero a entero al que se asigna el numero de
             caracteres escritos hasta que aparece %n

Saludos.


Título: Re: ¿ Como utilizar %n ?
Publicado por: Caster en 29 Septiembre 2012, 21:39 pm
Pues es simple, muestra el numero de caracteres escritos hasta donde esté "%n". Aunque yo estoy probando este codigo:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5. int numChars;
  6.        int a = 1;
  7.        int b = 12;
  8.  
  9.        printf("%d %d\n %n", a, b, &numChars);
  10.        printf("The above line contains %d characters.\n", numChars);
  11.  
  12. return 0;
  13. }

Y no me da bien el resultado, no se por qué.

Saludos


Título: Re: ¿ Como utilizar %n ?
Publicado por: sinatra en 29 Septiembre 2012, 22:12 pm

Y no me da bien el resultado, no se por qué.

Bueno, gracias por responder, asi se que no soy el unico al que le pasan estas cosas.


Título: Re: ¿ Como utilizar %n ?
Publicado por: Caster en 29 Septiembre 2012, 22:15 pm
He probado a cambiar el tipo de numChar, he probado con float, double, cadena de caracteres, etc pero sigue dando mal el resultado.

Saludos


Título: Re: ¿ Como utilizar %n ?
Publicado por: leosansan en 29 Septiembre 2012, 22:28 pm

El ejemplo es el siguiente:

Código
  1. #include <stdio.h>
  2. int main()
  3. {
  4.  int numChars;
  5. float a = 3.14159;
  6. int b = 3490;
  7. printf("%f %d%n\n", a, b, &numChars);
  8. printf("The above line contains %d characters.\n", numChars);
  9. }

La salida es :
Código
  1. 3.141590 3490
  2. The above line contains 13 characters.

Y el siguiente código:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.  int val;
  6.  printf("blah %n blah\n", &val);
  7.  printf("val = %d\n", val);
  8.  return 0;
  9. }

da como salida:
Código
  1. blah  blah
  2. val = 5
Como ves da los caracteres hasta ese punto.
PERO, eso es usando el compilador PellesC, porque en Code::Blocks nada de nada, las variables se llenan de "basura".
Saludos.


Título: Re: ¿ Como utilizar %n ?
Publicado por: Caster en 29 Septiembre 2012, 22:36 pm
La salida es :
Código
  1. 3.141590 3490
  2. The above line contains 13 characters.

Eso deberia ser lo correcto, pero a mi no me sale eso.

Saludos.


Título: Re: ¿ Como utilizar %n ?
Publicado por: leosansan en 29 Septiembre 2012, 22:44 pm
Citar
Lo que expuse en el anterior post es que ese formato no es "aconsejable" ya que depende del compilador que cada uno use.
Ya comente que en Code::Blocks no funciona, pero tampoco en Dev-C++, etc, sin embargo en el tal vez menos conocido Pelles C  sí da las salidas esperadas.

Saludos.


Título: Re: ¿ Como utilizar %n ?
Publicado por: Caster en 29 Septiembre 2012, 22:46 pm
Aaah vale vale, ya me quedo claro, muchas gracias.

Saludos


Título: Re: ¿ Como utilizar %n ?
Publicado por: rir3760 en 30 Septiembre 2012, 03:22 am
Hay que tener mucho cuidado con las afirmaciones que se hacen ...

Lo que expuse en el anterior post es que ese formato no es "aconsejable" ya que depende del compilador que cada uno use.
Honestamente no se donde leíste eso. No recuerdo un documento donde se desaconseje su uso, lo cual es entendible ya que el especificador "%n" es parte del estándar de C desde 1989.


Ya comente que en Code::Blocks no funciona, pero tampoco en Dev-C++, etc, sin embargo en el tal vez menos conocido Pelles C  sí da las salidas esperadas.
Acabo de compilar el programa:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int numChars;
  6.   float a = 3.14159;
  7.   int b = 3490;
  8.  
  9.   printf("%f %d%n\n", a, b, &numChars);
  10.   printf("The above line contains %d characters.\n", numChars);
  11.  
  12.   return 0;
  13. }
Con los compiladores Pelles C, Lcc-win32, MinGW (cortesía de Dev-C++) y CygMing (las versiones 3.X y 4.X de gcc incluidas en el entorno Cygwin) y todos generan el mismo resultado:
Código:
3.141590 3490
The above line contains 13 characters.

Un saludo


Título: Re: ¿ Como utilizar %n ?
Publicado por: Caster en 30 Septiembre 2012, 08:57 am
Pues yo lo he compilado con MinGW por consola para Windows y no daba el resultado esperado.

Saludos


Título: Re: ¿ Como utilizar %n ?
Publicado por: rir3760 en 30 Septiembre 2012, 16:03 pm
¿Que compilador estas utilizando?
¿Puedes publicar el código fuente completo del programa que esta dando resultados incorrectos?

Un saludo


Título: Re: ¿ Como utilizar %n ?
Publicado por: Caster en 30 Septiembre 2012, 16:24 pm
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.   int numChars;
  6.   float a = 3.14159;
  7.   int b = 3490;
  8.  
  9.   printf("%f %d%n\n", a, b, &numChars);
  10.   printf("The above line contains %d characters.\n", numChars);
  11.  
  12.   return 0;
  13. }

MinGW para Windows


Título: Re: ¿ Como utilizar %n ?
Publicado por: rir3760 en 30 Septiembre 2012, 16:44 pm
Pues como había dicho, acabo de compilar el programa con:
Lcc-win32
Pelles C
Dev-C++ (utiliza MinGW)
CygMing (la version 3.X y 4.X de gcc para Cygwin)

Y con todos ellos el resultado es el esperado:
Código:
3.141590 3490
The above line contains 13 characters.

La única recomendación que puedo darte es instalar el IDE de nuevo y verificar que este configurado correctamente, para eso alguien mas deberá ayudarte (no tengo instalado Code::Blocks).

Un saludo


Título: Re: ¿ Como utilizar %n ?
Publicado por: leosansan en 30 Septiembre 2012, 17:19 pm
Pues como había dicho, acabo de compilar el programa con:
Lcc-win32
Pelles C
Dev-C++ (utiliza MinGW)
CygMing (la version 3.X y 4.X de gcc para Cygwin)

Y con todos ellos el resultado es el esperado:
Código:
3.141590 3490
The above line contains 13 characters.
Citar
Me da que "deseas" machacar mis respuestas, querido amigo. Aunque resulte redundante, el susodicho programa no hace lo que se espera de él, en Dev-C++ ,Code::Blocks y compañía, al menos en Windows7, y no sólo lo digo yo, ahí están sinatra y Caster para corroborrarlo. Por mucho que forme parte del C antidiluviano. No me eches a mí la culpa de que no funcione, sólo constato un hecho y pongo en pro que con Pelles C for Windows si "rula" (=funciona, para que no me preguntes otra vez que significa, lo que me lleva a pensar que no eres muy cinéfilo- ).
Que a tí te funciona ... ¡me alegro por tí !, pero a otros no y yo lo que hago es "informarles de por qué: el compilador, el IDE, el sistema operativo o los astros!, vaya usted a saber.
Como casi siempre te conformas con "tirar" una respuesta o comentario sin aportar solución. Se te gradecería que nos digas por qué a nosotros no nos funciona, al menos bajo W7.

P:DMe alegra qu a tí te funcione bajo todos esos programas, yo me tengo que con formar con Pelles C.
Un saludo.