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

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 ... 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [38] 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 ... 160
371  Programación / Programación C/C++ / Re: ¿Donde puedo descargar un manual de C++ para principiantes? en: 15 Abril 2014, 15:43 pm
Un libro en linea que puede descargarse de forma gratuita y con una versión en español es Thinking in C++ 2nd Edition de Bruce Eckel.

Un saludo
372  Programación / Programación C/C++ / Re: Copiando cadenas - comportamientos extraños en: 15 Abril 2014, 08:04 am
Los errores principales son dos:

* Utilizas el puntero "saludo" sin inicializar:
Código
  1. char* saludo;
  2.  
  3. /* ... */
  4.  
  5. gets(saludo);
Debes reservar un bloque de memoria, almacenar la dirección de este en esa variable y solo entonces la utilizas (sin validaciones):
Código
  1. char *saludo;
  2.  
  3. /* ... */
  4.  
  5. saludo = malloc(100);
  6. puts("Texto:");
  7. gets(saludo);

* La función strncpy copia como máximo el numero de caracteres indicado pero, si copia el máximo, no agrega el '\0'. Bien verificas el numero de caracteres de antemano (lo cual pone fuera de lugar el uso de esa función) o agregas el '\0' de forma manual. Por lo anterior es mejor utilizar sprintf, de esta forma:
Código
  1. char *copySaludo = malloc(n + 1);
  2. sprintf(copySaludo, "%.*s", n, saludo);
  3. printf("Las %d primeras letras: \"%s\"\n", n, copySaludo);

----

Ademas de eso hay otras cosas que, sin ser errores, deberías cambiar en el programa como eliminar el uso de "sizeof(char)" (este siempre es igual a uno) y cambiar el uso de gets por fgets. Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
373  Programación / Programación C/C++ / Re: Ejercicio compila pero no se ejecuta en: 13 Abril 2014, 16:30 pm
Como ya te comentaron el problema principal se debe a que tratas de almacenar todas las lineas cuando lo único que haces con ellas es obtener (mediante atoi) un entero. Es mejor declarar un solo array de caracteres (ya lo haces, el array "nAlumnos") y reutilizar este cada vez que debas leer una linea de la entrada estándar.

Si con todo quieres utilizar memoria dinámica debes reservar primero la memoria del bloque principal y a continuación la memoria para cada linea. Antes de terminar el programa liberas la memoria de cada linea y por ultimo la del bloque principal. De esta forma:
Código
  1. /* ... */
  2.  
  3. #define TAMANIO  10
  4.  
  5. /* ... */
  6.  
  7. char nAlumnos[TAMANIO];
  8. int alumnos;
  9. int longitud;
  10. int x;
  11. int i;
  12. char **notas;
  13.  
  14. /* ... */
  15.  
  16. /* 1) Obtienes el numero de alumnos */
  17.  
  18. /* 2) Reservas el bloque de memoria principal */
  19. notas = malloc(alumnos * sizeof *notas);
  20.  
  21. /* 3) Reservas el bloque de memoria para cada alumno */
  22. for (i = 0; i < alumnos; i++)
  23.   notas[i] = malloc(TAMANIO);
  24.  
  25. /* 4) Realizas las operaciones del programa */
  26.  
  27. /* 5) Liberas la memoria utilizada por cada alumno */
  28. for (i = 0; i < alumnos; i++)
  29.   free(notas[i]);
  30.  
  31. /* 6) Liberas el bloque principal */
  32. free(notas);

Un saludo
374  Programación / Programación C/C++ / Re: Prioridad y asociatividad de los operadores en C. (Programa propio) en: 13 Abril 2014, 15:38 pm
lo que quiero hacer es reemplazar esta parte de tú código:

Código
  1. switch(op){
  2. case'+':resultado = atoi(aux[0]) + atoi(aux[1]);
  3. break;
  4. case'-':resultado = atoi(aux[0]) - atoi(aux[1]);
  5. break;
  6. case'*':resultado = atoi(aux[0]) * atoi(aux[1]);
  7. break;
  8. case'/':resultado = atoi(aux[0]) / atoi(aux[1]);
  9. break;
  10. case'%':resultado = atoi(aux[0]) % atoi(aux[1]);
  11. break;
  12. }

Por algo como lo que pongo a continuación, voy a poner un ejemplo sólo como referencia (por supuesto no es la correcta).-

Código
  1. int operador[]={+,-,*,/,%};
Y llamarlo desde op
Si entiendo correctamente lo que buscas es una función similar a eval de javascript para evaluar una expresión almacenada en una cadena.

En C no existe tal función, debes implementarla de forma manual con una sentencia por cada operador como vienes haciendo y para el caso puedes revisar los temas sobre evaluación de expresiones sencillas (hay varios temas relacionados en la base de datos de los foros, solo es cuestión de utilizar el motor de búsqueda).

Un saludo
375  Programación / Programación C/C++ / Re: Cadenas de caracteres con punteros en: 12 Abril 2014, 17:25 pm
pero si vos me decis que en ese puntero se almacena la direccion de la cadena "Hola como te va", porque cuando quiero imprimir la cadena no se pone el astarisco?
Código
  1. char *cadena = "Hola como te va";
  2. printf("%s", cadena);
Porque cuando utilizas la función printf con el especificador "%s" esta espera la dirección en memoria (puntero) del objeto (array) cuyo contenido (cadena) debe procesar (imprimir).

En el lenguaje C los arrays no se pasan por valor, en su lugar se pasa su dirección en memoria.

Un saludo
376  Programación / Programación C/C++ / Re: Duda EOF en: 12 Abril 2014, 16:58 pm
Funcionar, lo que se dice funcionar, funciona. Otra cosa es que los resultados sean los previstos, que no lo son.

Además de declarar main como int inicializo max a cero, que no lo estaba
A la variable "max" se le asigna el valor cero justo antes del bucle, con ella no hay problema.

El error se encuentra en el bucle while, al copiar el programa se colocaron mal los paréntesis:
Código
  1. while ((len = getline(line, MAXLINE) > 0 )) ...
Para que funcione correctamente basta con cambiarlo a:
Código
  1. /* Primero se asigna el resultado de getline a len y solo entonces se compara */
  2. while ((len = getline(line, MAXLINE)) > 0 ) ...

Un saludo
377  Programación / Programación C/C++ / Re: com imprimir varibles varias veces en: 11 Abril 2014, 06:03 am
lo que no entiendo es porque en unos usas .* y en otros solo *
Se utiliza el asterisco para evitar usar un valor entero directamente, en su lugar este se toma de la lista de argumentos. Por ejemplo en la llamada:
Código
  1. printf("%*c\n", 3, 'X');
El carácter 'X' se imprime en un campo de tres caracteres de ancho.

Con el especificador de formato "%s" se puede utilizar la forma "%N.Ms", donde "N" indica la anchura del campo y "M" el numero máximo de caracteres a imprimir (por supuesto siempre y cuando no se encuentre antes el '\0'). Por ejemplo la llamada:
Código
  1. printf("%*.*s\n", 5, 3, "abcde");
Imprime como máximo los tres primeros caracteres de la cadena (en este caso "abc") en un campo cuya anchura es de cinco caracteres.

nose si me podrias decir como se llama la tabla de carcateres especiales donde viene. \n valor 10 y asi susesivamente es que ya no la encuentro.
Supongo te refieres a ASCII

Un saludo
378  Programación / Programación C/C++ / Re: Cadenas de caracteres con punteros en: 11 Abril 2014, 05:44 am
Estoy estudiando C, y hasta ahora las cadenas de caracteres las venia creando asi:
Código
  1. char cadena[] = "Hola como te va";
Esa sentencia declara al array "cadena" y sus elementos se inicializan con 'H', 'l', etc.

pero ahora me encontre que tambien se puede hacer asi:
Código
  1. char *cadena = "Hola como te va";
y no entiendo porque funciona [...] en este caso lo estaria usando para guardar en el una cadena de texto
Funciona porque el valor inicial del puntero "cadena" es la dirección en memoria donde se almacena la cadena literal "Hola como te va". No se esta almacenando en el la cadena sino su dirección. Caso similar con el cartero: el no confunde la dirección en el sobre (un puntero) con el objeto que debe localizar (la casa).

Un saludo
379  Programación / Programación C/C++ / Re: Duda EOF en: 11 Abril 2014, 05:26 am
Introduces la combinación de teclas y a continuación presionas la tecla {ENTER}.

Un saludo
380  Programación / Programación C/C++ / Re: Realmente extraño problema con cin.getline en: 11 Abril 2014, 05:19 am
Como ya te comento nolasco281 ese comportamiento se debe al uso intercalado de cin y getline.

La opcion 2 termina con la sentencia:
Código
  1. cin >> CuentaNueva.Documento;
Ahí el avance de linea (el carácter '\n') se queda en el bufer de la entrada estándar.

La opcion 1 inicia con la sentencia:
Código
  1. cin.getline(User, 10, '\n');
Ahí el carácter '\n' (dejado por la sentencia anterior) se toma como una linea en blanco.

La solución es, después del uso de cin, utilizar un bucle para descartar el resto de linea o bien llamar a la función sync o ignore. Ejemplos sobre ello los puedes revisar mediante el motor de búsqueda de los foros.

Un saludo
Páginas: 1 ... 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [38] 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines