Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Error 404: en 8 Septiembre 2014, 23:22 pm



Título: Duda básica sobre C:
Publicado por: Error 404: en 8 Septiembre 2014, 23:22 pm
Hola a todos, veréis, en el manual que estoy leyendo sobre C, viene todo muy bien explicado y eso, pero hay un detalle que se han saltado, y que me tiene bastante confuso. Cuando ponen por ejemplo:
Código
  1. printf(%2d! = %ld\n”,i, factorial( i ) );
  2.  
Lo que no entiendo para qué sirve es el 2 y el 1 que hay delante de la "d" y detrás del "%".
Me ha pasado bastantes veces, no solo en este caso, siempre en los printf en los que se pone el signo "%", lo que hay detrás me confunde un poco.
No me malinterpreten, se que la "d" por ejemplo es para un número entero, pero no los números, y otras letras que se ponen en ocasiones, creo que la "s" es para una cadena no??
Si me pudieran explicar esto un poco os lo agradecería muchísimo.
Un saludo.


Título: Re: Duda básica sobre C:
Publicado por: netdrag0n en 8 Septiembre 2014, 23:40 pm
El 2 se refiere a la cantidad de numeros a mostrar ej 8885 va mostrar 88 nada mas  ,

%d o %i for int // enteros

%c para character // caracteres

%f para  float

%lf para double

%s para string

%x para hexadecimal

%ox para  octal


Título: Re: Duda básica sobre C:
Publicado por: Error 404: en 8 Septiembre 2014, 23:57 pm
ah vale, muchas gracias, y cual sería la diferencia entre mostrar string y mostrar caracteres?? :huh:
Es decir, string por ejemplo podría ser una frase cualquiera no?? Yo algunas cosillas que he programado en c++ y lo que he aprendido en conclase, para las frases y demás utilizaba el tipo char, aunque más tarde me entere del tipo string en este foro, y me dijeron que era más correcto, por eso me gustaría saber la diferencia. Muchas gracias por la ayuda. :)


Título: Re: Duda básica sobre C:
Publicado por: rir3760 en 9 Septiembre 2014, 00:24 am
Lo que no entiendo para qué sirve es el 2 y el 1 que hay delante de la "d" y detrás del "%".
El valor entero inmediatamente después del carácter '%' indica la anchura del campo con una alineación (predeterminada) a la derecha con el propósito de permitir una impresión en columnas.

Por ejemplo con este programa:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. int main(void)
  6. {
  7.   char *test[] = {
  8.      "a",
  9.      "bb",
  10.      "ccc",
  11.      "dddd"
  12.   };
  13.   size_t num_elem = sizeof test / sizeof test[0];
  14.   size_t i;
  15.  
  16.   for (i = 0; i < num_elem; i++)
  17.      printf("%5s %5d\n", test[i], (int) (i * pow(10, i)));
  18.  
  19.   return EXIT_SUCCESS;
  20. }
Se genera la salida:
Código:
    a     0
   bb    10
  ccc   200
 dddd  3000

Puedes encontrar mas ejemplos mediante el motor de búsqueda de los foros.

----

El 2 se refiere a la cantidad de numeros a mostrar ej 8885 va mostrar 88 nada mas
No. Si los caracteres generados sobrepasan la anchura del campo se imprimen tal cual, como si la anchura nunca se hubiera indicado.

----

cual sería la diferencia entre mostrar string y mostrar caracteres?
"%c" imprime un carácter mientras que "%s" imprime una cadena (secuencia de caracteres terminada con el carácter '\0'). Por ejemplo:
Código
  1. char ch = 'X';
  2. char str[] = "Hola";
  3.  
  4. printf("%s %c\n", str, ch); /* Imprime "Hola X" */

Yo algunas cosillas que he programado en c++ y lo que he aprendido en conclase, para las frases y demás utilizaba el tipo char, aunque más tarde me entere del tipo string en este foro, y me dijeron que era más correcto, por eso me gustaría saber la diferencia.
En el titulo del tema indicas que el lenguaje es C con "Duda básica sobre C:" pero ahora indicas que es C++, en el caso de este ultimo lo políticamente correcto es enfocarse en su biblioteca estándar: clase string, operadores ">>"/"<<" de las clases de entrada/salida, etc.

Un saludo


Título: Re: Duda básica sobre C:
Publicado por: eferion en 9 Septiembre 2014, 09:07 am
Yo algunas cosillas que he programado en c++ y lo que he aprendido en conclase, para las frases y demás utilizaba el tipo char, aunque más tarde me entere del tipo string en este foro, y me dijeron que era más correcto, por eso me gustaría saber la diferencia

Un "string" al estilo C puede estar definido de las siguientes maneras:

Código
  1. // Opción 1
  2. // Cadena de sólo lectura. Modificar su contenido puede provocar fallos en la aplicación.
  3. char *cadena = "Una frase cualquiera";
  4.  
  5. // Opción 2
  6. // Cadena de tamaño dinámico. Es la opción más flexible aunque puede provocar fugas de memoria
  7. // si no se hace con cuidado.
  8. char *cadena = malloc( x );
  9.  
  10. // Opción 3
  11. // Cadena de longitud fija. Es un diseño demasiado rígido ya que no te permite adaptarte.
  12. // Es esa longitud y punto, no hay más.
  13. char cadena[20];

C++ proporciona la clase "string", esta clase te proporciona la misma funcionalidad que el segundo caso con la ventaja de despreocuparte por el uso de memoria, es decir, te olvidas de malloc, free y realloc:

Un ejemplo en C:

Código
  1. char * cadena = malloc( 10 );
  2. strcpy( cadena, "123456789" );
  3. printf( "%s\n", cadena );
  4.  
  5. cadena = realloc( cadena, 20 * sizeof(char) );
  6. strcat( cadena, "0123456789" );
  7. printf( "%s\n", cadena );
  8.  
  9. free( cadena );

Equivalente en C++:
Código
  1. std::string cadena;
  2. cadena = "123456789";
  3. std::cout << cadena << std::endl;
  4.  
  5. cadena += "0123456789";
  6. std::cout << cadena << std::endl;

C++ te permite no "reinventar la rueda" cada dos por tres. Esto es a costa de delegar en las clases parte de la funcionalidad. Esto tiene la ventaja de que hay que escribir menos código y éste es menos propenso a errores... la parte negativa es que el código resultante es más lento. Eso sí, dudo mucho que seas capaz de notar la diferencia de velocidad a simple vista entre las dos versiones.


Título: Re: Duda básica sobre C:
Publicado por: Error 404: en 9 Septiembre 2014, 11:12 am
Vale, muchas gracias a todos, ya me ha quedado bastante más claro ;-)