Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#931
Cita de: josri en 15 Marzo 2013, 07:28 AMLa segunda pregunta es como puedo leer el apellido pero que solo quede en un registro de 6 posiciones, por ejemplo:HERNANDEZ se guardaria como HERNAN o DIAZ se guardaria como DIAZ**(* = espacios en blanco), intente hacer esto con substr pero me marca error.
Lo ideal seria que utilizaras solo las facilidades de la biblioteca estándar de C++ como la función getline y la clase string ...

Pero si piensas utilizar funciones como fscanf una solución es leer del archivo el apellido y almacenarlo en una variable temporal (eso para evitar ciertos detallitos de la función), a continuación lees del temporal los caracteres necesarios y los imprimes con el formato deseado.

Un ejemplo sencillo en C donde "temp" es la variable temporal y "campo" la ubicación final del apellido:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char *ape[] = {
      "HERNANDEZ",
      "DIAZ",
      "GONZALEZ",
   };
   char temp[100];
   char campo[100];
   int i;
   
   for (i = 0; i < 3; i++){
      sscanf(ape[i], "%[^|]", temp);  /* archivo ==> temp  */
      sprintf(campo, "%-6.6s", temp); /*    temp ==> campo */
     
      printf("\"%s\"\n", campo);
   }
   
   return EXIT_SUCCESS;
}


Su salida es:
"HERNAN"
"DIAZ  "
"GONZAL"


La cadena de formato "%-06.6s" se utiliza para indicar:
1) "-", alineación a la izquierda.
2) "6.", impresión con seis caracteres de ancho, los faltantes serán espacios.
3) ".6", se leen del argumento (en este caso temp) un máximo de seis caracteres.

Un saludo
#932
Cita de: 85 en 15 Marzo 2013, 03:22 AM
baaaaaaaaaaaannnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn!
es un bot
Cuando eso suceda no cites el spam (incluyendo el vinculo). En su lugar deja que los moderadores hagan su trabajo (si no te molesta cuando detectes un mensaje como ese puedes enviarles un MP).

Un saludo
#933
Programación C/C++ / Re: Pregunta de C scanf
15 Marzo 2013, 04:18 AM
Cita de: g0rg3d3l4s3lv4 en 15 Marzo 2013, 01:28 AMpara que sirve %*c
El asterisco indica que el valor se lee pero no se almacena. Siguiendo tu ejemplo:
scanf("%c %*c",&r);
La función scanf con:

1) "%c" lee un carácter y lo almacena en la variable "r".
2) " " descarta todo el espacio blanco (espacio, tabulador, avance de linea, etc.).
3) "%*c" lee un carácter, este se descarta.

Es útil en ciertos escenarios, por ejemplo para leer una linea de un máximo de 100 caracteres pero sin incluir el avance de linea (de forma similar a la función gets):
char linea[101]; /* +1 para el '\0' */

/* ... */

scanf("%100[^\n]%*c", linea);

Con "%100[^\n]" se lee un máximo de 100 caracteres, la condición aquí es ser distintos de '\n' (el avance de linea), a continuación este se lee y descarta con "%*c".

Un saludo
#934
Como ya se comento no es posible sin el uso de un array o, como en el programa de mDrinky, mediante la reserva de memoria en tiempo de ejecución.

En cuanto a este ultimo considerando que se trabaja con enteros se pueden sustituir las llamadas a malloc y memset (su prototipo se encuentra en <string.h>) por una llamada a calloc. Y si la intención es leer números de un solo dígito mejor indicarlo así en la llamada a scanf con "%1d".

Por ultimo ya que en este caso el rango de números es pequeño (0 a 9) se puede utilizar el array como uno de banderas indicando si el numero ya fue introducido:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char *Buffer = calloc(10, 1);
   int numero;
   int i;

   printf("Ingrese 10 numeros: ");
   for (i = 0; i < 10; i++){
      scanf("%1d", &numero);
     
      if (Buffer[numero]++){
         puts("Numero repetido!");
         break;
      }
   }
   
   return EXIT_SUCCESS;
}


Un saludo
#935
Ya que piensa usar etiquetas en lugar de lineas para separar las preguntas y respuestas me parece mas sencillo utilizar solo un objeto de la clase string para almacenar todo el contenido del archivo. Mas o menos así:
Código (cpp) [Seleccionar]
ifstream in("Entrada.txt", ifstream::in);
string texto;
string linea;

while (getline(in, linea))
   texto += linea + '\n';

cout << texto;
in.close();


Y para encontrar las etiquetas de apertura y cierre puede utilizar la función miembro std::string::find.

Un saludo
#936
Cita de: wazausky en 10 Marzo 2013, 21:19 PMQuiero que sea capaz de ingresar "a", la operacion (ya sea "+", "-", "*" o "/") y "b" en un solo paso.
Si te refieres a usar una sola llamada a función basta con:
scanf("%f %c %f", &a, &o, &b);

Si te refieres a introducir los operandos y el operador en la misma linea no hay problema, solo se tiene que introducir, por ejemplo:
2 + 2

Por ultimo tu programa tiene un error importante: para leer un carácter con scanf se debe utilizar " %c", no es correcto "%s" ya que este es para cadenas (una palabra).

Un saludo
#937
Supongo las razón es utilizar un IDE (tal vez Dev-C++, no lo mencionas) que no genera una pausa de forma automática.

Si quieres esa pausa hay varias opciones, por ejemplo una llamada a la funcion get justo antes del final de la función principal:
Código (cpp) [Seleccionar]
int main()
{
   // ...
   
   cin.get();
   return 0;
}


Un saludo
#938
Cita de: leosansan en  9 Marzo 2013, 14:04 PMY en este caso la "basurilla" se elimina dejando simplemente un espacioen blanco en los scanf
Correcto. En la primera llamada a scanf hay que cambiar la cadena de formato a:
scanf(" %[^\n]", nom);

Con las otras dos llamadas no es necesario porque cuando se utilizan los especificadores de formato "%d", "%f", etc. lo primero que hace scanf es descartar el espacio blanco (las únicas excepciones son "%c" y "%[]").

Un saludo
#939
Un problema con la función:
void LimpiarBuffer()
{
   while(getchar() != '\n' && getchar() != EOF);
}

Supongamos que el resto de la linea es 'a', '\n'. La primera llamada descarta el carácter 'a' y la segunda el carácter '\n' (ahí el problema). En la segunda iteracion del bucle getchar espera un carácter y este debe ser un avance de linea (de no ser así el bucle continua).

Para evitarlo se debe leer un carácter por iteracion comparando este contra las dos constantes:
void LimpiarBuffer(void)
{
   int ch;
   
   while ((ch = getchar()) != '\n' && ch != EOF)
      ;
}


Un saludo
#940
Cita de: 85 en  9 Marzo 2013, 09:11 AM
rico bot
Si vas a citar al spambot por favor elimina el link.

Cita de: 85 en  9 Marzo 2013, 09:11 AM
void logme(char * fmt, ... )
{
   // ...

ofstream fout;
¿Programas en C++? Bueno, en ese caso deberías utilizar las facilidades que este provee, empezando por la clase string.

Un saludo