Autor
|
Tema: Que hago mal? compilar pero no ejecuta bien (Leído 4,334 veces)
|
roser24
Desconectado
Mensajes: 18
|
Hola chicos,pues tal y como dice el titulo empeze a hacer el siguiente ejercicio no me da errores en la compilacion y ejecuta pero solo hasta cuando inserto la cadena.. probe con gets con scanf para leerla pero sigue igual,una vez le doy intro me da un error y se cierra .. ,por favor si podeis mirarlo y si veis los errores indicarmelo,de momento solo quise validar la letra A ..Salu2 /*7. Crear una función a la que se le pasará una cadena de caracteres de cualquier longitud y retornará el número de vocales distintas que la forman. Genera un programa principal en el se introduzca una cadena que se validará para que incluya todas las vocales.*/ #include<stdio.h> #include<string.h> #include<stdlib.h> void f_vocales(char *,int); void f_visu(char *,int); int main(){ int l,aux; printf("Introduce la longitud de la cadena:\n"); char *cad =(char *)(malloc(sizeof(char)*l )); do{ printf("Introduce la cadena:\n"); //gets(cad); }while(aux<0 || aux>l); f_vocales(cad,aux); f_visu(cad,aux); return 0; } void f_vocales(char *cadena,int size){ int i=0,cont=0; for(i=0;*(cadena+i)!='\0'&& i<size;i++){ if(*(cadena+i)=='a'){ cont++; } } printf("el numero de veces que aparece a es:%d",cont ); } void f_visu(char *cadena,int size){ int i=0; for(i=0;*(cadena+i)!='\0'&&i<size;i++){ } }
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
el problema está aqui: void f_visu(char *cadena,int size){ int i=0; for(i=0;*(cadena+i)!='\0'&&i<size;i++){ } }
Para imprimir una cadena con printf y %s no necesitas ir realizando printfs como si imprimiras carácter a carácter, %s indica que le pasas una cadena, y la imprimirá entera. Por tanto tienes dos opciones: void f_visu(char *cadena){ printf("%s",cadena );/* imprimimos toda la cadena de una sola vez*/ }
Notese que no necesitamos el tamaño ni un contador en esta función. o bien, una solución mas similar a la función que daba problemas: void f_visu(char *cadena,int size){ int i=0; for(i=0;*(cadena+i)!='\0'&&i<size;i++){ printf("%c",*(cadena +i )); /*imprimimos caracter a carácter*/ } }
|
|
|
En línea
|
|
|
|
roser24
Desconectado
Mensajes: 18
|
Hola Akai,gracias por tu ayuda,corregi mi codigo y ejecuta pero me cuenta y me muestra solo la primera parte de la cadena es decir hasta que encuentra un /0, quite la condicion de /0 en el for de la funcion pero me sigue haciendo lo mismo al ejecutar.. probe tmb con gets(cad) pero me ejecuta mal compilar si lo dejo con gets,.. estoy usando mal el gets? pongo mi codigo actual.. /*7. Crear una función a la que se le pasará una cadena de caracteres de cualquier longitud y retornará el número de vocales distintas que la forman. Genera un programa principal en el se introduzca una cadena que se validará para que incluya todas las vocales.*/ #include<stdio.h> #include<string.h> #include<stdlib.h> void f_vocales(char *,int); void f_visu(char *); int main(){ int l,aux; printf("Introduce la longitud de la cadena:\n"); char *cad =(char *)(malloc(sizeof(char)*l )); do{ printf("Introduce la cadena:\n"); //scanf("%s",cad); }while(aux<0 || aux>l); f_vocales(cad,aux); f_visu(cad); return 0; } void f_vocales(char *cadena,int size){ int i=0,cont=0; for(i=0;i<size;i++){ if(*(cadena+i)=='a'){ cont++; } } printf("el numero de veces que aparece a es:%d",cont ); } void f_visu(char *cadena){ printf("\nla cadena introducida fue %s",cadena ); }
|
|
« Última modificación: 5 Mayo 2010, 21:18 pm por roser24 »
|
En línea
|
|
|
|
roser24
Desconectado
Mensajes: 18
|
:oLes va a parecer raro seguramente pero si quito el \n de un printf exactamente del de visualizar,.. me ejecuta bien el conteo y la visualizacion de la cadena.. como puede ser posible esto?
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
El problema, que no lo había pensado antes, es la "basura" que se queda por usar scanf, en concreto un \n de cuando pulsas la tecla enter para introducir el tamaño de la cadena. Y es lo que se come gets(cadena). Lo raro, es que te funcione si quitas un \n de un printf que nada tiene que ver con la entrada de datos. Lo que se me ocurre, es hacer un gets justo después del scanf, para limpiar el n residual, que luego es machacado por el siguiente gets(cadena). Aun así es una forma un tanto.. sucia de hacerlo, existiendo otras funciones que permiten una entrada mas "limpia" de datos, pero no las conozco. el apaño temporal para el programa es: char *cad =(char *)(malloc(sizeof(char)*l ));
|
|
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Procura ponerle nombres significativos a las variables, ¿qué es eso de "l"? Básate en esto: #include <stdio.h> #include <stdlib.h> void contarA(char *cadena) { unsigned int contador = 0, i; for(i = 0; *(cadena + i); i++) if(*(cadena + i) == 'a') contador++; printf("La letra \"a\" aparece %u veces.", contador ); } void ver(char *cadena) { unsigned int i = 0; while(*(cadena + i)) } int main(void) { unsigned int n; do { printf("Longitud de la cadena : "); } while(scanf("%u", &n ) != 1); char *cadena = (char *)malloc(sizeof(char) * n ); contarA(cadena); ver(cadena); return 0; }
|
|
|
En línea
|
|
|
|
roser24
Desconectado
Mensajes: 18
|
hola,bueno vereis ya corregi el codigo del programa,añadiendo una "basura". #include<stdio.h> #include<string.h> #include<stdlib.h> void f_vocales(char *,int); void f_visu(char *); int main(){ int l,aux; char basura; printf("Introduce la longitud de la cadena:\n"); char *cad =(char *)(malloc(sizeof(char)*l )); do{ printf("Introduce la cadena:"); }while(aux<0 || aux>l); f_vocales(cad,aux); f_visu(cad); return 0; } void f_vocales(char *cadena,int size){ int i=0,cont=0; for(i=0;i<size;i++){ if(*(cadena+i)=='a'){ cont++; } } printf("el numero de veces que aparece a es:%d\n",cont ); } void f_visu(char *cadena){ printf("la cadena introducida fue %s",cadena ); }
Leo ,mmm hay varias lineas de tu codigo que no he visto nunca y por ello no lo entiendo.. por ejemplo lo de "setbuf(stdin, NULL); "de todas maneras gracias =),
|
|
|
En línea
|
|
|
|
cgvwzq
Desconectado
Mensajes: 57
Agente P.
|
Lo del setbuf no lo he usado nunca, pero imagino que si no se usa buffer se imprime directamente en pantalla (sin necesidad de llenarlo o llegar a salto de linea o fin de fichero).
Y te recomiendo usar fgets en lugar de gets.
|
|
|
En línea
|
Some stuff:- www.a] parsed as ]www.a]
- Bypass elhacker's img filter with ALT attribute!
- ¿Para cuándo SQLi I y II? WZ
|
|
|
roser24
Desconectado
Mensajes: 18
|
okis,de verdad chicos que mil gracias por todos vuestros consejos apartir de ahora usar fgets una cosilla el formato es fgets(cadena, n, stdin); n siempre sera el valor de i longitud sin contar el \0? o me olvido de los \0 con esta funcion?
|
|
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
setbufCon fgets es conveniente leer n-1 del espacio total de la cadena, para asegurarte que luego puedes finalizar la cadena con '\0', aunque la función igualmente lo hace por vos, es conveniente asegurarse. En C, lamentablemente, nunca te tienes que olvidar de los '\0'. Saludos!
|
|
« Última modificación: 5 Mayo 2010, 23:13 pm por Littlehorse »
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Codigo php no se ejecuta bien en IE pero en chrome y firefox si !!!
Desarrollo Web
|
HDS02
|
1
|
5,358
|
1 Enero 2011, 00:34 am
por WHK
|
|
|
El programa se ejecuta en el localhost pero en el servidor no se ejecuta
PHP
|
ferarteclasico
|
2
|
4,447
|
8 Julio 2011, 01:38 am
por дٳŦ٭
|
|
|
efecto animate() de jQuery se ejecuta pero no se aprecia la animacion [Resuelto]
Desarrollo Web
|
4rkn63l
|
2
|
3,173
|
12 Marzo 2012, 06:15 am
por 4rkn63l
|
|
|
Parametro de funcion load() Ajax no ejecuta bien
PHP
|
Lupin
|
5
|
3,378
|
20 Abril 2013, 19:11 pm
por Lupin
|
|
|
Destructor se ejecuta bien pero da error al final de la ejecución [SOLUCIONADO]
Programación C/C++
|
SARGE553413
|
5
|
3,470
|
25 Abril 2013, 16:00 pm
por SARGE553413
|
|