Duda básica sobre C:

Iniciado por Error 404:, 8 Septiembre 2014, 23:22 PM

0 Miembros y 1 Visitante están viendo este tema.

Error 404:

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:

printf( "%2d! = %ld\n",i, factorial( i ) );

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.
Si se puede imaginar, se puede programar.

netdrag0n

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

Error 404:

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. :)
Si se puede imaginar, se puede programar.

rir3760

Cita de: superkorlas en  8 Septiembre 2014, 23:22 PMLo 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:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
   char *test[] = {
      "a",
      "bb",
      "ccc",
      "dddd"
   };
   size_t num_elem = sizeof test / sizeof test[0];
   size_t i;
   
   for (i = 0; i < num_elem; i++)
      printf("%5s %5d\n", test[i], (int) (i * pow(10, i)));
   
   return EXIT_SUCCESS;
}

Se genera la salida:
    a     0
   bb    10
  ccc   200
dddd  3000


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

----

Cita de: netdrag0n en  8 Septiembre 2014, 23:40 PMEl 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.

----

Cita de: superkorlas en  8 Septiembre 2014, 23:57 PMcual 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:
char ch = 'X';
char str[] = "Hola";

printf("%s %c\n", str, ch); /* Imprime "Hola X" */


Cita de: superkorlas en  8 Septiembre 2014, 23:57 PMYo 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
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

eferion

Cita de: superkorlas en  8 Septiembre 2014, 23:57 PM
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:


// Opción 1
// Cadena de sólo lectura. Modificar su contenido puede provocar fallos en la aplicación.
char *cadena = "Una frase cualquiera";

// Opción 2
// Cadena de tamaño dinámico. Es la opción más flexible aunque puede provocar fugas de memoria
// si no se hace con cuidado.
char *cadena = malloc( x );

// Opción 3
// Cadena de longitud fija. Es un diseño demasiado rígido ya que no te permite adaptarte.
// Es esa longitud y punto, no hay más.
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:


char * cadena = malloc( 10 );
strcpy( cadena, "123456789" );
printf( "%s\n", cadena );

cadena = realloc( cadena, 20 * sizeof(char) );
strcat( cadena, "0123456789" );
printf( "%s\n", cadena );

free( cadena );


Equivalente en C++:
Código (cpp) [Seleccionar]

std::string cadena;
cadena = "123456789";
std::cout << cadena << std::endl;

cadena += "0123456789";
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.

Error 404:

Vale, muchas gracias a todos, ya me ha quedado bastante más claro ;-)
Si se puede imaginar, se puede programar.