|
451
|
Programación / Programación C/C++ / Re: [?] Error fgets (Solucionado)
|
en: 20 Enero 2014, 23:23 pm
|
Yo lo he interpetrado como n caraceteres Por cierto: while ((ch = getchar()) != '\n') { Cadena[i++] = ch; //printf("\ni=%d\n",i); }
¡Peligro de desbordamiento! Si le meto más caracteres de la cuenta (5) estaré desbordando el array. Se me paso un if en el código anterior que ya he arreglado:............................. while ((ch = getchar()) != '\n') { if (i<=MAX-1) Cadena[i++] = ch; .....................................
¡¡¡¡ Saluditos! ..... !!!! P.D: Sigo pensando que esto se aparta del objetivo del fgets, que me ratifico en lo que propuse, salvo nueva aportación, cosa que espero.
|
|
|
452
|
Programación / Programación C/C++ / Re: Process returned 0
|
en: 20 Enero 2014, 22:00 pm
|
Saludos, tengo entendido que al compilar un programa si te aparece un mensaje que diga Process returned 0 (0x0) quiere decir que compilo bien y sin errores, pero a mi en el siguiente codigo no me aparece ese mensaje, pero tampoco me aparecen mensajes de error o warnings, el programa tiene que leer un archivo y almacenar algunos datos en la variable que le corresponda, pero no se donde esta el error?? y por que el programa no termina como deberia
Pues a mí me sale esto, nada de return 0:C:\Users\Administrador\Documents\C\TEMP\Untitled2.c||In function 'main':| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|12|error: unknown type name 'COD'|C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|19|warning: assignment makes pointer from integer without a cast [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|22|warning: assignment makes pointer from integer without a cast [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|27|warning: assignment makes pointer from integer without a cast [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|30|warning: assignment makes pointer from integer without a cast [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|33|warning: assignment makes pointer from integer without a cast [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|36|warning: assignment makes pointer from integer without a cast [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|39|warning: assignment makes pointer from integer without a cast [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|49|warning: conflicting types for 'buscarFinLinea' [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|41|note: previous implicit declaration of 'buscarFinLinea' was here| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|56|warning: conflicting types for 'ignorarEspacios' [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|21|note: previous implicit declaration of 'ignorarEspacios' was here| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|65|error: conflicting types for 'Tabla_Operandos'| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|19|note: previous implicit declaration of 'Tabla_Operandos' was here| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|96|warning: conflicting types for 'quitarSaltosLinea' [enabled by default]| C:\Users\Administrador\Documents\C\TEMP\Untitled2.c|92|note: previous implicit declaration of 'quitarSaltosLinea' was here| ||=== Build finished: 2 errors, 10 warnings (0 minutes, 0 seconds) ===| ¿Seguro que has puesto todo el código?.¡¡¡¡ Saluditos! ..... !!!!
|
|
|
453
|
Programación / Programación C/C++ / Re: [?] Error fgets (Solucionado)
|
en: 20 Enero 2014, 20:24 pm
|
Ah leñe, lo que tengo que hacer ahí es cambiar este printf: printf("\nIntroduce un numero de 4 digitos: \n");
Por este más genérico: printf("\nIntroduce un numero de %d digitos: \n",MAX);
Ala, problema resuelto ¿Queeeeeeeeeeeeeeeeeeé?. ¿Qué es eso de problema resuelto?. Se trata de ingresar cuatro dígitos, no cinco pequeño saltamontes.
Es coña, la hora será.
Eh aquí tu solución adaptada a cuatro dígitos y sólo cuatro: Introduce un numero de 4 digitos: 123 Numero menor cifras.
Introduce un numero de 4 digitos: 3265 Cadena = 3265 Numero = 3265
Introduce un numero de 4 digitos: 12 Numero menor cifras.
Introduce un numero de 4 digitos: 123456 Numero mayor cifras.
Introduce un numero de 4 digitos: 2541 Cadena = 2541 Numero = 2541
Introduce un numero de 4 digitos: 1 Numero menor cifras. [/size]
#include <stdio.h> #define MAX 5 #define TONUM 48 int main() { char Cadena[MAX+1]= {""}; int i,Numero; int ch; while (1){ printf("\nIntroduce un numero de 4 digitos: \n"); i = 0; while ((ch = getchar()) != '\n') { if (i<=MAX-1) Cadena[i++] = ch; } if (i==MAX-1){ Cadena[i] = 0; printf("Cadena = %s \t Numero = ",Cadena); // Ahora convertimos la cadena a numerico for(i=0; Cadena[i]; i++) { Numero = Cadena[i] - TONUM; printf("%d", Numero); } printf("\n"); } else if (i>MAX-1) puts ("Numero mayor cifras. "); else puts ("Numero menor cifras. "); } return 0; }
¡¡¡¡ Saluditos! ..... !!!! REEDITADO Y MEJORADO.
|
|
|
454
|
Programación / Programación C/C++ / Re: [?] Error fgets (Solucionado)
|
en: 20 Enero 2014, 16:51 pm
|
Tal como tienes en el post esta es la salida: Introduce un numero de 4 digitos: 12345 Cadena = 12345 Numero = 12345<==AQUI admite 5 caracteres
Introduce un numero de 4 digitos: 1234 Cadena = 1234 Numero = 1234
Con la corrección que te indico del -1 esta es la salida: Introduce un numero de 4 digitos: 12345 Cadena = 1234 Numero = 1234<==AQUI está O.K
Introduce un numero de 4 digitos: 1234 Cadena = 1234 Numero = 1234
Introduce un numero de 4 digitos: 123 Cadena = 123 Numero = 123
¡¡¡¡ Saluditos! ..... !!!! P.D: Pero conste que la gracia era solucionar lo del fgets, nada de scanf ni getchar.
|
|
|
455
|
Programación / Programación C/C++ / Re: Pasar a función array de punteros.-
|
en: 20 Enero 2014, 16:43 pm
|
..................................... alguien me podría decir como pasar un array de punteros a función ........................................
Por ejemplo, si tienes el puntero **A y lo vas a pasa a la función ver_matriz:void ver_matriz( int **mat, int fil, int col )
.......................................... y la segunda, ¿como puedo hacer para que la cantidad de punteros se pida que se ingrese por teclado y no ponerlo a mano?. .........................................
Te pongo dos casos que se me ocurren:#include <stdio.h> #include <stdlib.h> void ingresoCorrecto(int*, int); int main(void){ char **ptrNombres; int indice=0, longitud=0,ch; puts("\n Indique cuantos nombres va a ingresar de 15 caracteres maximo:"); scanf ("%d",&longitud); ptrNombres = malloc( longitud * sizeof *ptrNombres ); for( indice = 0; indice < longitud; ++indice ) ptrNombres[indice] = malloc( 15 * sizeof **ptrNombres ); while ((ch = getchar()) != EOF && ch != '\n'); for(indice=0; indice<longitud; indice++){ printf("Nombre [%d]: ", indice+1); scanf ("%s",*(ptrNombres+indice)); while ((ch = getchar()) != EOF && ch != '\n'); } printf("\n"); for(indice=0; indice<longitud; indice++){ printf("[%d] %s ", indice+1, *(ptrNombres+indice)); } ingresoCorrecto(&indice,longitud); printf("\n Su eleccion fue...: %s", *(ptrNombres+indice-1)); for (indice = 0; indice < longitud; indice++) free(ptrNombres[indice]); free(ptrNombres); return 0; } void ingresoCorrecto(int *ingreso, int longitud){ int ch=0, ok=0, temp=0; do{ printf("\n\n ingrese un entero del [1] al [%d] para extraer un nombre..:", longitud); ok = scanf("%d", &temp) == 1 && temp > 0 && temp <= longitud; while ((ch = getchar()) != EOF && ch != '\n'); }while(!ok); *ingreso = temp; }
#include <stdio.h> #include <stdlib.h> void ingresoCorrecto(int*, int); int main(void){ char *ptrNombres[15]; int indice=0, longitud=0,ch; puts("\n Indique cuantos nombres va a ingresar de 15 caracteres maximo:"); scanf ("%d",&longitud); for ( indice = 0; indice < longitud; indice++) ptrNombres[indice] = malloc(sizeof *ptrNombres[indice]); while ((ch = getchar()) != EOF && ch != '\n'); for(indice=0; indice<longitud; indice++){ printf("Nombre [%d]: ", indice+1); scanf ("%s",*(ptrNombres+indice)); while ((ch = getchar()) != EOF && ch != '\n'); } printf("\n"); for(indice=0; indice<longitud; indice++){ printf("[%d] %s ", indice+1, *(ptrNombres+indice)); } ingresoCorrecto(&indice,longitud); printf("\n Su eleccion fue...: %s", *(ptrNombres+indice-1)); free(ptrNombres); return 0; } void ingresoCorrecto(int *ingreso, int longitud){ int ch=0, ok=0, temp=0; do{ printf("\n\n ingrese un entero del [1] al [%d] para extraer un nombre..:", longitud); ok = scanf("%d", &temp) == 1 && temp > 0 && temp <= longitud; while ((ch = getchar()) != EOF && ch != '\n'); }while(!ok); *ingreso = temp; }
Espero no se me haya ido la olla entre tanto puntero. ¡¡¡¡ Saluditos! ..... !!!!
|
|
|
456
|
Programación / Programación C/C++ / Re: [?] Error fgets (Solucionado)
|
en: 20 Enero 2014, 15:16 pm
|
No es eso, sino que se salta un caso. Y si le pongo aún más se salta más casos.
Es lo que te comenté. Al poner MAX=10 al noveno caracter se queda "fuera" de la cadena, es decir en el buffer. No he entendido lo de que se salta un caso.
Una forma simple de evitarlo es la ya indicada de sobredimensionar MAX a 100, por poner un número. Se supone que si al usuario se le piden cuatro caracteres tampoco va a ser tan bruto de ingresar tropecientos.
Claro que como siempre hay brutitos dispuestos a reventar un código a la fuerza, otra opción es comprobar si la cadena es mayor o menor de cuatro dígitos y si no pedir nueva introducción de datos, siem`re que no se "pase" de 100 y si no más tamaño a Cadena.
Lo cierto es que ahora funciona y sólo admite cuatro dígitos, ni más ni menos. Ya me comentarán que tal.
Y una muestra: Introduce un numero de 4 digitos: 123
Introduce un numero de 4 digitos: 3215 Numero=3215 Cadena=3215 Introduce un numero de 4 digitos: 123456789456321
Introduce un numero de 4 digitos: 6541 Numero=6541 Cadena=6541 Introduce un numero de 4 digitos: 123
Introduce un numero de 4 digitos: 12
Introduce un numero de 4 digitos: 2589 Numero=2589 Cadena=2589 Introduce un numero de 4 digitos: 321654987654321654987
Introduce un numero de 4 digitos: 2561 Numero=2561 Cadena=2561
#include <stdio.h> #include <string.h> #define TONUM 48 #define MAX 100 #define N 5 int main() { char Cadena[MAX]={""}; int i,ch,Numero[N]; while (1) { do{ printf("\nIntroduce un numero de 4 digitos: \n"); fgets(Cadena, MAX, stdin); }while (strlen(Cadena)!=N); Cadena[N-1] = '\0'; // Ahora convertimos la cadena a numerico printf("Numero="); fflush(stdout); for(i=0;Cadena[i];i++) { Numero[i] = Cadena[i] - TONUM; printf("%d", Numero[i]); } printf("\tCadena=%s", Cadena); } return 0; }
Por otro lado una pequeña observación:.....................................................
int main() { char Cadena[MAX+1]= {""}; int i,Numero; char ch;
while (1) { printf("\nIntroduce un numero de 4 digitos: \n");
i = 0;
//ch = getchar();
while ((ch = getchar()) != '\n') ......................................................
la función getchar es de tipo int y por ello ch ha de ser int, no char. ¡¡¡¡ Saluditos! ..... !!!! P.D: Se me olvidaba, el código como lo tienes, además de admitir menos de cuatro caracteres, admite hasta cinco.
Creo que es aquí donde está el error: while (1) { printf("\nIntroduce un numero de 4 digitos: \n");
i = 0;
//ch = getchar();
while ((ch = getchar()) != '\n') { if (i < MAX) <== aquí va MAX-1 Cadena[i++] = ch; }
|
|
|
457
|
Programación / Programación C/C++ / Re: [?] Error fgets (Solucionado)
|
en: 20 Enero 2014, 11:17 am
|
Vaya pues no había caído en eso . Muy buen ojo Leo. Tú solución no funciona adecuadamente si le metes 9 caracteres o más. El buffer de escritura es una fulana de cuidado. La solución que se me ocurre es leerlo caracter a caracter: Excelente opción. ;- Y lo de los nueve caracteres es por el tamaño que le dí a MAX, Si lo pongo mayor más "traga". Pero no es plan, claro.¡¡¡¡ Saluditos! ..... !!!!
|
|
|
458
|
Programación / Programación C/C++ / Re: problemas al trabajar con ficheros [C]
|
en: 19 Enero 2014, 22:33 pm
|
mm no se que funcion es perror............................
He aquí una referencia a la función perrormm ....................... de hecho,tampoco se me permite trabajar con stdlib.h Pues un copy-paste, cortesía del maestro rir3760:#include <stdio.h> #define NOM_ENTRADA "C:/users/robert/desktop/entrada" #define NOM_SALIDA "C:/users/robert/desktop/salida" int main(void) { FILE *entrada; FILE *salida; if ((entrada = fopen(NOM_ENTRADA, "r")) == NULL){ puts("error archivo entrada."); return 1; } if ((salida = fopen(NOM_SALIDA, "w")) == NULL){ puts("error archivo salida."); fclose(entrada); return 2; } /* ... */ return 0; }
¡¡¡¡ Saluditos! ..... !!!!
|
|
|
459
|
Programación / Programación C/C++ / Re: [?] Error fgets (Solucionado)
|
en: 19 Enero 2014, 21:56 pm
|
La solución es poner MAX = 5, también cambiara el for por: for(int i=0;Cadena[i] != '\0';i++) { Numero[i] = Cadena[i] - TONUM; printf("%d", Numero[i]); }
De esa forma leerá hasta que encuentre el caracter nulo, lo que te permitirá meter cadenas de 1,2,3,4 caracteres. Tú código actual solo permite cadenas de 4 caracteres (si le metes 3, te saldrán un dato "extraño". La solución que aporta amchacon tiene un "pero", el caracter de fin de línea que introduce fgets al final de la cadena que podría tener efectos indeseables en el resto del código.
He aquí una salida con "repetición" para ver el efecto indeseado de ese caracter: #include <stdio.h> #define MAX 5 #define TONUM 48 int main() { char Cadena[MAX]={""},come_buffer[100]; int i,ch,Numero[MAX-1]; while (1) { printf("\nIntroduce un numero de 4 digitos: \n"); fgets(Cadena, MAX, stdin); // Ahora convertimos la cadena a numerico for(i=0;Cadena[i];i++) { Numero[i] = Cadena[i] - TONUM; printf("%d", Numero[i]); }//while((ch = getchar()) != '\n'); } return 0; }
Introduce un numero de 4 digitos: 1234 1234 Introduce un numero de 4 digitos:<==de forma automática "salta" la introducción a mano -38 Introduce un numero de 4 digitos: 12345 1234 Introduce un numero de 4 digitos:<==de forma automática "salta" la introducción a mano y devuelve lo que quedaba en el buffer, el 5, acompañado además 5-38 Introduce un numero de 4 digitos:<==si es menor que 4 devuelve el número "acompañado" 12 12-38 Introduce un numero de 4 digitos: 5432 5432 Introduce un numero de 4 digitos:<==de forma automática "salta" la introducción a mano -38 Introduce un numero de 4 digitos:<==si es menor que 4 devuelve el número "acompañado" 321 321-38 Introduce un numero de 4 digitos: 123456 1234 Introduce un numero de 4 digitos:<==salto automático y 56-38<==lo que queda en el buffer "acompañado"
Una forma de evitar ambas cosas, el caracter extraño y tener que limpiar el buffer, es sobredimensionar de entrada el array Cadena y ya luego nos ocupamos de darle el tamaño que queramos, 5 en este caso.
Con esta idea, ésta es la salida: Introduce un numero de 4 digitos: 123 Numero=123 Cadena=123 Introduce un numero de 4 digitos: 1234567 Numero=1234 Cadena=1234 Introduce un numero de 4 digitos: 32 Numero=32 Cadena=32 Introduce un numero de 4 digitos: 32564 Numero=3256 Cadena=3256 Introduce un numero de 4 digitos: 3214 Numero=3214 Cadena=3214 Introduce un numero de 4 digitos: 1 Numero=1 Cadena=1
#include <stdio.h> #define MAX 10 #define N 5 #define TONUM 48 int main() { char Cadena[MAX]={""},come_buffer[100]; int i,ch,Numero[N]; while (1) { printf("\nIntroduce un numero de 4 digitos: \n"); fgets(Cadena, MAX, stdin); if (strlen(Cadena)<MAX) Cadena[strlen(Cadena)-1] = '\0'; Cadena[N-1] = '\0'; // Ahora convertimos la cadena a numerico printf("Numero="); fflush(stdout); for(i=0;Cadena[i];i++) { Numero[i] = Cadena[i] - TONUM; printf("%d", Numero[i]); } printf("\tCadena=%s", Cadena); } return 0; }
Es sólo una idea, ¡¡¡Ehhhh!!!. Admito con gusto otras sugerencias más cualificadas que la mía. ¡¡¡¡ Saluditos! ..... !!!!
|
|
|
460
|
Programación / Programación C/C++ / Re: Control de sonido.
|
en: 17 Enero 2014, 22:00 pm
|
a ver XD Las librerías que pide son estas: #include <mmdeviceapi.h> #include <endpointvolume.h> Y no la Window$.h :/
no estoy seguro pero creo que estas librerías vienen en una cosa que se llama windows SDK. Si alguien tiene alguna idea si es eso correcto que me corrija. Sin ánimo de piques, y menos a estas horas, a esas preguntas es a lo que conteste.
No conocía el mmsystem.h, de ahí que no contestara a la pregunta inicial.
Por si no te has dado cuenta soy un neófito en este mundillo y me limito a responder a aquello que entra dentro de mis límites, de ahí mi ausencia de contestación a la pregunta inicial, pero a la otra sí que podía y, es más, estaba en lo cierto.
Gracias por la información que has aportado, escasa y general, pero menos es nada. Se echa de menos algún código, por pequeño que fuera, que aclare más.¡¡¡¡ Saluditos! ..... !!!!
|
|
|
|
|
|
|