Problemas con el compilador de C

Imagen de RoxeR
0 puntos

Hola xic@s. Ayer hice un pequeño programilla en C con Anjuta. El caso es que tengo que hacer una chapucilla para
que funcione como debería funcionar. Aquí os dejo el código de dicho programa (que consiste en pedir un tamaño de
lado de un cuadrado y un carácter y dibujar dicho cuadrado con ese carácter). Lo que pongo /*comentado*/ es la cha-
puza que he de descomentar para que todo tire bien.
El caso es que no debería hacer falta esa chapuza, pero dentro de lo malo, por lo menos debería dejarme utilizar la
función fflush(stdin) justo antes de pedir el carácter por teclado para limpiar el buffer del teclado. Pues bien, eso
tampoco funciona. Pasa del fflush como de la m****a.
La respuesta del profesor ha sido que "Los fanáticos de Linux hablan mucho de que lo suyo es mejor que Windows, pero
no tienen más que problemas de éste tipo". El caso es que le he dicho que mañana (en el peor de los casos la semana que
viene)intentaría llevar este programa resuelto sin ningúna chapuza (sin necesitar leer dos veces un carácter para quedarme
con uno realmente, bien porque encuentre la forma de hacerlo bien sin necesitar tampoco el fflush, o bien sabiendo cómo
utilizar el fflush correctamente y que tire bien).
Así que... dejo la veda abierta... si podéis echarme una mano, os lo agradeceré muchísimo. Porque como éste programa se
me presentan ahora un montón.
Por cierto, decir que tengo instalado gcc, g++, cpp y build-essential en sus versiones más recientes.

Lo dicho: muchas gracias por adelantado por la ayuda.

PROGRAMA:

#include

main()
{
int lado, i, j;
char car/*, basura*/;

do
{
printf ("\nIntroduzca el lado del cuadrado (2-40): ");
scanf ("%d", &lado);
}
while (lado < 2 || lado > 40);

printf ("\nIntroduzca el carácter a imprimir: ");
/*scanf ("%c", &basura);*/ // o bien... /*fflush (stdin)*/ // ésto último no me funciona.
scanf ("%c", &car);
printf ("\n");

for (i = 1; i <= lado; i++)
printf ("%c ", car);
printf ("\n");
if (lado > 2)
for (j = 2; j < lado; j++)
{
for (i = 1; i <= lado; i++)
(1 == i || lado == i) ? printf ("%c ", car) : printf (" ");
printf ("\n");
}
for (i = 1; i <= lado; i++)
printf ("%c ", car);
}

Imagen de RoxeR
+1
0
-1

Aquí pongo el programa completo, que no sé porqué me lo ha cortado.
Ahora sí lo sé. Después de editarlo veinte veces, he tenido que cambiar los símbolos menor por 'menor'. Así que, allí donde
pongo 'menor', es, pues eso, el símbolo menor, que no sé porqué si no no aparece en pantalla en este foro.

#include 'menor'stdio.h>

main()
{
int lado, i, j;
char car/*, basura*/;

do
{
printf ("\nIntroduzca el lado del cuadrado (2-40): ");
scanf ("%d", &lado);
}
while (lado < 2 || lado > 40);

printf ("\nIntroduzca el carácter a imprimir: ");
/*scanf ("%c", &basura);*/ // o bien... /*fflush (stdin)*/ // ésto último no me funciona.
scanf ("%c", &car);
printf ("\n");

for (i = 1; i 'menor'= lado; i++)
printf ("%c ", car);
printf ("\n");
if (lado > 2)
for (j = 2; j 'menor' lado; j++)
{
for (i = 1; i 'menor'= lado; i++)
(1 == i || lado == i) ? printf ("%c ", car) : printf (" ");
printf ("\n");
}
for (i = 1; i 'menor'= lado; i++)
printf ("%c ", car);
}

+1
0
-1
Imagen de xlarsx
+1
0
-1

while (lado 40);

debería ser:

while(lado == 40);

o quizá

while(lado!=40);

¿Que mensajes te da el compilador?

Saludos
A.T.T.E.

Luis Alejandro Rangel

+1
0
-1

A.T.T.E.

Luis Alejandro Rangel

Imagen de RoxeR
+1
0
-1

Perdón. No lo muestra porque aparece otro 'menor' por lo que veo.
Esa linea a la que te refieres es la siguiente en mi programa:

while (lado 'menor' 2 || lado > 40);

Respondiendo a "qué mensajes te da el compilador"... no me da ningún mensaje.
Me pide un nº, espera a que se lo dé, pulso intro tras meter el nº, imprime
"introduzca un carácter: " y sin esperar a nada, finaliza su ejecución tranquilamente.
Al compilar no me aparece ningún tipo de error. Me dice que todo está OK. Y, como ya digo
mi profesor me dijo que el programa está correcto totalmente, de hecho lo probamos en su
PC (Windows con TurboC) y tira perfectamente bien con el fflush (stdin) justo antes de pe-
dir el caracter. Pero a mí ni con esas.

+1
0
-1
Imagen de xlarsx
+1
0
-1

Por que no intentas usar el std::cin y el std::cout de c++ (librería: iostream).

Y cuando visualizas que tiene las variables en algun debugger... tiene basura?

Saludos

A.T.T.E.

Luis Alejandro Rangel

+1
0
-1

A.T.T.E.

Luis Alejandro Rangel

Imagen de xlarsx
+1
0
-1

En ocasiones después de meter un caracter recive el siguiente y se puede saltar la entrada... para leer caracteres usa: getch(), getchar() o getche().... no uses el scanf() ... Saludos

A.T.T.E.

Luis Alejandro Rangel

+1
0
-1

A.T.T.E.

Luis Alejandro Rangel

Imagen de sansatan
+1
0
-1

Te recomiendo que uses otras herramientas más sofisticadas que no te van a dar problemas:

Como decía alguien más arriba, una opción es usar las funciones de C++, cin y cout. Para un programa sencillo como éste en el que no vas a usar programación orientada a objetos, apenas tendrías que cambiar nada.

Otra opción de más alto nivel pero mucho más potentes es la librería ncurses.

+1
0
-1

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

Imagen de sansatan
+1
0
-1

Te he escrito el código modificado usando C++:

http://cl1p.net/programa_cuadrado/

+1
0
-1

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

Imagen de xlarsx
+1
0
-1

Solamente le cambié un par de lineas :D

Aquí tienes:

http://cl1p.net/prog2/

Saludos

A.T.T.E.

Luis Alejandro Rangel

+1
0
-1

A.T.T.E.

Luis Alejandro Rangel

Imagen de RoxeR
+1
0
-1

Gracias a todos por las resppuestas, pero... me gustaría poder solucionar ésto sin meter de por medio
nada relacionado con C++. Sólo con lenguaje C propiamente, que es lo que estoy estudiando.
En cuanto a quien me propone usar getchar() o getch(), dos cosas:

1. Con getchar() me pasa lo mismo. Se traga un carácter (código ASCII 10, o sea, un INTRO) que yo
no entiendo de donde se lo saca pues scanf debería esperar en las lineas anteriores un número y
un INTRO, y después un carácter y otro INTRO. El caso es que con getchar() sigue tragándose "algo"
que no debiese. Y como fflush(stdin) no funciona aquí, pues no puedo limpiar el buffer del teclado
(con instrucciones propias de C digo).

2. La instrucción getch() tampoco me la reconoce, y me dice cuando compilo:
/tmp/ccMKoxPM.o: En fuciñon `main':ejc3_4.c:(text+0x67):referencia a `getch' sin definir
collect2:Id devolvió el estado de salida 1
Completado ...incorrectamente
Esto es el mensaje LITERAL que me da.

¿Alguna otra idea? Graxias no obstante a todos.

+1
0
-1
Imagen de xlarsx
+1
0
-1

Por lo del punto número 2, es cierto, había olvidado que esa función estaba definida solo en los borland, por consiguiente no la vas a poder conseguir a menos que obtengas esa librería... (ahorita no recuerdo como se llama... :( )

En ocasiones, (lamentablemente) tienes que poner dos veces el getchar()... para que te capte el otro enter... (por eso me gusta mas C++ :D ) o cualquiera de los otros 2...

Por que no aceptas las herramientas de C++, de todos modos no estas programando en C++ :D

A.T.T.E.

Luis Alejandro Rangel

+1
0
-1

A.T.T.E.

Luis Alejandro Rangel

Imagen de RoxeR
+1
0
-1

"No acepto" (o más bien, "prefiero no tener que usar") herramientas de C++ porque me gustaría usar lenguaje C puro y duro. Sin tener que recurrir a C++ por problemas como éste, pues algo tan 'sencillo' como esperar un carácter y que lo lea como debe, debería no tener complicaciones, digo yo, sin necesidad de incluir otra librería y utilizar sentencias de C++.

No obstante, he ido a probar el std::cin, incluyendo la libreria iostream.h, y me dice que no la tengo. ¿Qué paquete debería instalar
para tenerla (teniendo en cuenta, como dije anteriormente creo, que tengo ya gcc, g++, cpp y build-esential instaladas)?

+1
0
-1
Imagen de sansatan
+1
0
-1

El programa que te escribí incluye "iostream", NO "iostream.h":

http://cl1p.net/programa_cuadrado

y aquí con los cambios de xlarsx:

http://cl1p.net/prog2

+1
0
-1

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

Imagen de RoxeR
+1
0
-1

Qué más da iostream que iostream.h, es lo mismo. No obstante probé las dos formas y me contesta exactamente lo mismo.

+1
0
-1
Imagen de sansatan
+1
0
-1

Para usar getch necesitas incluir la librería ncurses:

#include

... y, evidentemente, tenerla instalada (está en los repositorios de Ubuntu, usa apt)

+1
0
-1

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

Imagen de sansatan
+1
0
-1

+1
0
-1

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

Imagen de sansatan
+1
0
-1

Instalar ncurses con:

apt-get install libncurses5-dev

y el include:

#include ncurses

(con los símbolos menor y mayor de rigor)

+1
0
-1

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

Imagen de camilo.verdugo
+1
0
-1

RARO EL ERROR WON... PERO AHI TA.... ME PARC Q EL SCANF... GUARDABA ALGUN DATO BASURA... PERO CON EL GETCHAR...

Como encontre un poco ilegible el codigo... lo arregle un poco

http://www.compartelo.cl/?q=29619

xau

www.cavg.drhost.cl

+1
0
-1
Imagen de xlarsx
+1
0
-1

Multiples formas de hacerlo :D Así debe ser... y gracias por recordarme la librería... :D

A.T.T.E.

Luis Alejandro Rangel

+1
0
-1

A.T.T.E.

Luis Alejandro Rangel

Imagen de PedroEsteban
+1
0
-1

Pedro Esteban

Soy novato en programción en C de forma que es muy prbable que derrape. Pero por si te fuese útil se me ocurre que el problema viene del hecho de que al hacer el primer scanf, puesto que se añade un '/n' al buffer al hacer ENTER y puesto que '/n' no sera leido por ser un dato numerico el que se espera, este '/n' queda en el buffer. En el siguiente scanf, puesto que lo que lees es un caracter, la lectura se para en ese '/n' que es lo unico que se lee. Aparentemente la solucion es iniciar el segundo scanf con (%*c%c....) ya que %*c deja sin efecto el primer caracter leido.

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de RoxeR
+1
0
-1

Esa es la chapucilla que quiero evitar (dos scanf de los cuales uno es inutil). Para ello quería usar el fflush(stdin), el cual no hace su función y, aunque compila bien, no hace NADA.

+1
0
-1
Imagen de PedroEsteban
+1
0
-1

Pedro Esteban

Por lo que he podido deducir del libro de Javier Ceballos C/C++ Curso de programación, la funcion fflush no tiene efecto en stdin (tu caso, creo) en UNIX/LINUX, aunque si funciona en flujos stdout.

De todas maneras no entiendo demasiado porque te molesta tanto emplear el doble scanf aunque sea de forma velada tal como te propongo. En todo caso, y puesto que lo que (te) propones tiene un algo de reto incluso para una novato (yo) pues pondré las antenas, y si algo veo o se me ocurre te contesto.
Ciao

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de RoxeR
+1
0
-1

Si es que no se trata de que me moleste tanto o tan poco. Es que eso es una chapuza como quien pone un cubo encima del agujero del tejado de su casa para arreglar una gotera. Me gustaría arreglar la gotera arreglando el tejado, no con un cubo. Vamos, que el doble scanf funciona, pero no deja de ser una chapuza. Eso no es programar bien en C. Eso es que las cosas te funcionen en C. El día que tenga que leer en un programa enorme 200 veces variables de tipo carácter, ¿qué hago? ¿poner 400 scanf? No hombre!

+1
0
-1
Imagen de PedroEsteban
+1
0
-1

Acerca del tejado

No querría seguir en una polémica sobre el asunto ya que no creo que ni:
1) tenga autoridad para ello, pues practicamente empiezo,
2) no creo que te ayude en nada a resolver el problema seguir por esta via, pero:

Tal vez no me haya explicado bien, y :

1) mi propuesta es que substituyas scanf("%c", &car) por scanf("%*c%c", &c), no que repitas un scanf 'basura' cada vez. Ya se que en el fondo lo que yo digo es lo mismo, pero donde tengas que entrar 200 scanf seguirás entrando 200 scanf.
2) fflush en flujos desde el origen no funcionan en UNIX/LINUX.

Con todo, seguiré tu hilo, pués si la solución existe la verdad es que será útil. Reconozco que puede resultar engorroso tener que verificar si puede quedar o no un caracter en el buffer cada vez que se programe una entrada, puesto que por lo que se ve fflush no nos ayuda en nada. Esperemos que alguien arregle el entuerto. Solo te pido que venga de donde te venga la solución, ya sea del foro o de fuera, la cuelgues aqui. Yo al menos te lo agradeceré. Suerte!!

Pedro Esteban

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de PedroEsteban
+1
0
-1

Acerca del tejado (2)

Soy yo de nuevo. Habia olvidado una cosa: ¿probaste la solucion que te dio Sormes, es decir, usar fpurge?
¿Funciona?

PedroEsteban

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de RoxeR
+1
0
-1

Esta respuesta le sirve ya de paso a Sormes:

La instrucción fpurge() tampoco me la reconoce, y me dice lo siguiente cuando compilo:
/tmp/ccUJFOu5.o: En fuciñon `main':ejc3_4.c:(text+0x5A):referencia a `fpurge' sin definir
collect2:Id devolvió el estado de salida 1
Completado ...incorrectamente

Esto es el mensaje LITERAL que me da.

+1
0
-1
Imagen de PedroEsteban
+1
0
-1

Acerca de fpurge

Efectivamnete. Con fpurge me pasa lo mismo que a ti. (con tu programa que me he permitido copiar). En cambio el programa con el scanf tal y como te he indicado ("%*c%c etcetera) funciona... pero si eso no te sirve... pues nada, lo dicho, si encuentro alguna otra cosa te lo cuento.

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de PedroEsteban
+1
0
-1

El programa

Bien Veo que me ha pasado como a ti con los simbolitos 'menor que'...viene ha ser como el 'flex' de la publicidad, por lo visto. Ahi va mi segundo intento...usando tu astucia:

#include 'menor'stdio.h>

main()
{
int lado, i, j;

do
{
printf ("\nIntroduzca el lado del cuadrado (2-40): ");
scanf ("%d", &lado);
}
while (lado>40 || lado 'menor'2);

printf ("\nIntroduzca el carácter a imprimir: ");

scanf ("%*c%c", &car);
printf ("\n");

for (i = 1; i 'menor'= lado; i++)
{
for (j = 1; j 'menor'= lado; j++)
printf ("%c ", car);
printf ("\n");
}
printf ("\n");
}

Insisto, espero que te sirva...y suerte con el profe!!!

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de PedroEsteban
+1
0
-1

El programa

Hola, soy Pedro de nuevo.

Tal vez ya hayas modificado tu código, puesto que de hecho, cuando lo ejecuto, aunque con al modificación que te indico "funciona" la verdad es que no dibuja un cuadrado tal y como pretendias. Así que he reescrito el código, que me ha quedado asi

#include

main()
{
int lado, i, j;

do
{
printf ("\nIntroduzca el lado del cuadrado (2-40): ");
scanf ("%d", &lado);
}
while (lado>40 || lado <2);

printf ("\nIntroduzca el carácter a imprimir: ");

scanf ("%*c%c", &car);
printf ("\n");

for (i = 1; i <= lado; i++)
{
for (j = 1; j <= lado; j++)
printf ("%c ", car);
printf ("\n");
}
printf ("\n");
}

Espero que te sirva

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de bizkor
+1
0
-1

.

+1
0
-1

Lo simple es de una mayoria, lo bueno solo unos pocos lo tienen. No seamos egoistas! compartamos Ubuntu!

Imagen de PedroEsteban
+1
0
-1

Posible solucion (Bizkor, intentalo de nuevo!!)

Bizcor!!! Por favor, itentalo de nuevo pues tu "Posible solución" no queda reflejada en pantalla

Gracias

PedroEsteban

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de RoxeR
+1
0
-1

A falta de esa posible solución de Bizcor, hasta ahora tu solución ( la de scanf ("%*c%c", &car) ) es la que más me ha
convencido (tienes razón, no son dos scanf), aunque siga un poco fastidiado porque me gustaría encontrar la forma de que
compilase sin necesidad de estos "parchecillos", pues a cualquiera que le muestres el código, te dirá que con un scanf ("%c", &car)
es suficiente, pues es lo correcto y lo que DEBERÍA compilar Y ejecutar bien, pero... a falta de pan... pues eso.
Ahora (y abierto aún a nuevas sugerencias, que a todos les agradezco mucho), me gustaría saber, pues al haber trabajado sólo con Borland
en el pasado y no necesitar más que, como mucho el fflush(stdin) que tiraba perfectamente, no sé qué es exactamente lo que hace tu propuesta. La he probado, funciona, pero, ¿ qué función realiza el %*c ???. El %c recoge un carácter a la entrada de datos, pero, el anterior, %c le metes un '*' en medio, no lo había visto nunca. Can you explain me, please? Gracias.

+1
0
-1
Imagen de PedroEsteban
+1
0
-1

Hola RoxeR:

xlarsx y Bizkor, dan recomendaciones más adelante acerca de las librerías a cargar para evitar estos problemas. Las probaremos. Pero por ahora respondo a tu pregunta.

En un anterior comentario ya te dije que probablemente el problema viene del hecho de que en el scanf precedente, puesto que se lee un dato numérico, queda en el buffer un /n, el cual se produce como última entrada al teclear después de entrar el valor del lado. Normalmente la función de limpieza del buffer ofrecida pr fflush evita la aparición de problemas como el que nos viene ocupando. Pero, ya te dije también que parece ser que en UNIX/LINUX fflush no tiene efecto en flujos de datos desde el origen. Y entonces, ¿porque el exotismo del scanf "estrellado"? La especificación de formato general para un scanf es %[*][ancho][h/l]tipo

donde,

* (asterístico después del %) suprime la asignación del siguiente dato en la entrada
ancho --> máximo numero de caracteres a leer en la entrada
h prefijo para los tupos d,i,n,o y x para un short int...etc
l idem para long... etc

Así que, en nuestro caso, el asterisco sirve para saltarse la lectura del /n pendiente, y así empezar con buen pie la lectura de datos. Al no poner el susodicho %*c en tu programa el scanf de lectura del caracter leia el "/n" pendiente, y dibujaba el cuadradito de caráteres con carácteres nulos, y volvia a mostrar el prompt del sistema. Yo no lo consideraria una falta de compilador. El problema estriba, creo yo en que fflush no nos ayuda aparentemente, y lo que nos queda por averiguar ahora es si con el consejo de xlarsx/Bizcor fflush se decide a hacer la labor que tiene encomendada. Si eso fuese asi, problema resuelto sin "truquillo"

Todo eso a lo que hago referencia lo puedes encontrar mejor explicado en el capítulo 2 del "C/C++, Curso de programación" de Javier Ceballos.

Suerte, y hasta la próxima!!

PedroEsteban

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de Goyo
+1
0
-1

Yo hace mucho que no ando con esto pero, en primer lugar, hay varias versiones de C. Yo utilicé K&R, ANSI y Borland, y no funcionan exactamente igual ni tienen las mismas bibliotecas.

Pero tu problema para mí que tiene que ver con la distinta forma de tratar los saltos de línea en Windows y en Unix, que no me acuerdo cuál es la diferencia pero la hay (creo que en Windows es un sólo carácter para salto de línea y retorno de carro mientras que en Unix son dos).

Me parece que está perfectamente justificado leer un carácter adicional si es necesario, siempre que sepas por qué es necesario y lo puedas explicar. Investiga sobre lo de los saltos de línea y probablemente encontrarás la explicación.

+1
0
-1
Imagen de PedroEsteban
+1
0
-1

Pedro Esteban

Estoy de acuerdo con Goyo en cuanto a si es o no buena practica hacer una lectura adicional de caracter cuando es necesario. Despues de todo, si una rutina adicional de una supuesta libreria X nos lo evitase, en el fondo lo que haría esa rutina es hacerlo por nosotros, pero hacerlo al fin y al cabo.

Y lo que sigue es para Roxer. En mi explicacion sobre el papel del %*C se ha producido de nuevo el efecto "Menor que" y alli, donde despues de "teclear" habia escrito "menor que"ENTER> el editor se ma ha comido el ENTER. Asi que el texto ha quedado un tanto raro y dificil de leer. Por cierto, ¿tiene alguien idea de a quien habria que darle un toquecillo sobre este, y otros efectos raros del editor de comentarios?.

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de RoxeR
+1
0
-1

Efectivamente yo también estoy de acuerdo en que algo que se programa de una forma es válido siempre y cuando puedas y sepas justificar su presencia en el código. Hasta ahí todo bien. El tema es que un compilador de C debería debería ser eso, un compilador de C y no lo siguiente: el de Borland tiene funciones especiales y en él funcionan cosas que en otros no. Pero bueno, el caso de Borland es caso aparte. Pero que en cualquier otro compilador te funcione bien el fflush(stdin) y en UNIX no, ???. Además de que no debería tener que usar el fflush, un scanf a diferencia del getchar o del getch, siempre debe esperar a que el usuario escriba algo y después pulse INTRO, por lo que tras la entrada introducida debe saber que hay un INTRO (\n) y eliminarlo del buffer de entrada (pero aquí el compilador de C de UNIX me rompe todos los esquemas).
A lo que voy, que me desvío: el scanf("%*c%c", &car) funciona bien y tal, guay, pero, si me llevo este programa a ejecutar en un Windows, donde más que probablemente no usen el compilador de UNIX, qué pasará. Allí bastaría un simple scanf("%c", &car), y, lo dicho, qué pasará, ¿pasará por alto por lo del asterisco el carácter introducido por el usuario (puesto que el \n del printf anterior lo eliminará correctamente) y se tragará el INTRO introducido tras el caracter que metemos? Me temo que eso será lo que ocurra. Por eso me gustaría encontrar una solución que me asegure que me funcionará en todas partes, como sería el caso de realizar un fflush(stdin) antes del scanf del carácter. Eso funcionaría a las mil maravillas en cualquier compilador, pues si hay algo en el buffer de entrada lo borra de antemano, y si no, pues nada, seguimos. PEEEERO... no funciona en UNIX, curioso.

+1
0
-1
Imagen de PedroEsteban
+1
0
-1

Pedro Esteban

Es cierto que scanf debe de esperar un enter pero ¿es obligatorio que retitre el /n en cualquier caso, incluso cuando lo que lee es un dato numérico que es incompatible con /n? ¿Sabes si es así en WIndows? Se me ocurre una solución que solamente puedo sugerir y no realizar puesto ya dije que son nuevo en esto. Seria la de crear una funcion ad-hoc, del estilo "LeeAlgo(formato) que ejecute un fflush(stdin) y compruebe entonces si el buffer de entrada esta vacio y si no que lo vacie. Para eso sería necesario disponer de un puntero al buffer de entrada que no tengo ni idea de como se consigue, pero tal vez tu si. Acto seguido habria que ejecutar scanf dentro de la propia función. El formato se podria pasar como cadena en la llamada a la función. Imagino que eso es posible. Conseguiriamos así la compatibilidad Windows/Unix a la que te refieres ¿no?. Por el instante me parecería ésta una solución suficientemente elegante. Tu que piensas?

Pedro

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de PedroEsteban
+1
0
-1

Pedro Esteban

RoxeR: He encontrado en http://www.developerweb.net/forum/archive/index.php/t-4246.html, un problema parecido al tuyo. Creo que la solución que se propone ahi es buena...si funciona, claro.

+1
0
-1

Lentitud en arranque de aplicaciones

De un dia para otro las aplicaciones toman un tiempo enorme en arrancar. Alguna idea al respecto?

Pedro Esteban

 

 

Imagen de Goyo
+1
0
-1

Lo de fflush no sé por qué será, pero lo de scanf no creo que sea debido a que la función sea diferente diferente sino que lo que es diferente es el input (aunque teclees lo mismo). Tú piensas en un usuario escribiendo letras y pulsando intro, pero el input es un archivo de texto y en distintos sistemas puede tener distintos formatos aunque sean las mismas letras y el mismo intro.

Recuerda que un char no es una letra, es un byte (o dos, yo que sé). Si la secuencia de bytes es distinta en Windows que en Unix el mismo algoritmo no va a dar el mismo resultado.

+1
0
-1
Imagen de RoxeR
+1
0
-1

No nos rallemos... ¿cómo que el input es un archivo de texto? es la entrada directa por teclado en este caso.
Un char, efectivamente no es una letra y un intro. Es un byte seguido del carácter ASCII que representa el INTRO (el 10).

Y respondiendo un poco a esto y a Pedro Esteban cuando pregunta si debe o no retirar el \n y si sé que en Windows ésto ocurra así, diré que no es un tema de Windows, es un tema del resto de compiladores que no son el de UNIX (Borland, el de Visual C, etc). Las especificaciones generales del scanf (es decir, el funcionamiento general del scanf en la inmensa mayoría de los compiladores) son: lee un determinado nº de bytes (dependiente del formato de lo que vamos a leer), y espera un INTRO. En el momento en que tecleamos INTRO, debe asignar ese nº de bytes introducido por entrada a la variable indicada, y retirar automáticamente (puesto que siempre espera un INTRO final que se sabe que sirve sólo para dar por finalizada la entrada de datos al scanf) el último \n.

+1
0
-1
Imagen de Goyo
+1
0
-1

Es porque el signo "menor" se interpreta como el comienzo de una etiqueta HTML, lo que se permite para poder formatear el texto. Supongo que se puede escribir el símbolo como en las páginas web, no recuerdo cómo es pero cualquier manual de HTML lo dice.

+1
0
-1
Imagen de xlarsx
+1
0
-1

Librerías que deberías tener instaladas:

build-essential gcc g++ make

Con eso no te debería dar problemas... :I

A.T.T.E.

Luis Alejandro Rangel

+1
0
-1

A.T.T.E.

Luis Alejandro Rangel

Imagen de bizkor
+1
0
-1

Justo se me fue la luz de casa... y ya veo k lo unico k puse fue un punto jeej. ya nada:( iba a decir lo de instalar las librerias como bien a dicho Xlarsx... pero bueno se me a adelantado.
Ami me funciono en mi casa intalar eso asok m imagino k a ti tambien. prueba aver

perdonar por mi comentario anterior en blanco, no fue error mio.. la naturaleza k ace k se corte los cables de luz hasta hoy.

un saludo a todos!

+1
0
-1

Lo simple es de una mayoria, lo bueno solo unos pocos lo tienen. No seamos egoistas! compartamos Ubuntu!

Imagen de RoxeR
+1
0
-1

Tenía instalado (pero aún así lo acabo de confirmar en el Synaptic) las 4 librerías que me decís (gcc, g++, build-essential y make) y además cpp, pero, no. No me va nada de lo que anteriormente he dicho que no me iba. :-(

+1
0
-1
Imagen de Cristobal López
+1
0
-1

¿Podrías poner aquí exactamente que es lo que te pone la consola o Anjuta como mensaje de error? Ayudaría bastante.
Aparte de eso comentarte que cin y cout se implementaron en C++ porque scanf daba muchos problemas sobre distintos tipos de datos, al igual que printf, problemas de tipo truncamiento.
Añade también la librería stdlib.h o stdlib, además si el cuadrado es hueco en su interior (cosa que no especificas) deberías utilizar /t.
Intentaré mañana hacerlo, a ver si me sale, ahora ya es muy tarde.
Por cierto el menor que se escribe con ampersand lt ; (todo junto) lt significa lower than (menor que o más pequeño que)

Saludos

MiBlog
MiWeb

+1
0
-1
Imagen de RoxeR
+1
0
-1

Esta es lo que veo en consola cuando ejecuto el programa:

------------------------------------------------------------------------------------
EXECUTING:
/Mis documentos/Universidad/lp/programas C/ejc3_4
----------------------------------------------

Introduzca el lado del cuadrado (2-40): 3
Introduzca el carácter a imprimir:

----------------------------------------------
Program exited successfully with errcode (3)
Press the Enter key to close this terminal ...

---------------------------------------------------------------------------------------

En cuanto introduzco '3' y pulso INTRO, me aparece en pantalla TODO LO DEMÁS, no dejándome hacer nada más.

Y respondiendo a tu duda acerca de si el cuadrado está hueco o no, te diré que sí, y que he de hacerolo con ' ' (espacios) en vez
de con \t (tabulaciones) porque con las tabulaciones no puedes dejar un espacio blanco de 1, 2, 5, 7, ... espacios en blanco (puesto que van de 3 en 3), y si creas por ejemplo un cuadrado de lado 7, por ejemplo, entre medias ha de haber 5 espacios en blanco, y contabulaciones no puedes dejar esos espacios exactos.

+1
0
-1
Imagen de mesjetiu
+1
0
-1

Hola a todos!!

Lo primero debo presentarme. Soy nuevo en el foro, nuevo en la programación (llevo una semana excasa, aunque algún tiempo hice mis pequeños pinitos con Basic y más tarde con Visual Basic), en linux llevo unos años, aunque me queda mucho que aprender aún. Actualmente uso Fedora core 6.

Yo también me topé con ese problema del scanf(), pero he encontrado una solución "no chapucera" navegando por la red , y es incluir antes del scanf() una linea "__fpurge(stdin);" sin las comillas. Por lo que se ve tiene la misma función que fflush(stdin);, sólo que funciona en linux. No he tenido que añadir ninguna librería, simplemente con stdio.h ha funcionado. Aún no lo he probado con lcc, el compilador de windows que uso, ni sé si será compatible a priori con otros compiladores. De todos modos, si en linux usamos __fpurge(stdin), y en Borland fflush(stdin), sabiéndolo, la conversión puede ser automatizada por el editor de textos, algo que no sería tan sencillo con scanf("%*c%c"...), que no sería tan fácil de sustituir.

Además encontré otro problema en el uso de ésto último, y es si formamos un bucle entre dos funciones. En el ejemplo que pongo más abajo, se pide al usuario adivinar una letra, si la letra tecleada es la "A", entonces ha acertado y el programa acaba, pero si no acierta volverá a darle una oportunidad. Aquí nos encontramos con el problema: si en scanf(), ponemos "%*c%c", la primera vez no funcionará si no tecleamos dos caracteres (absurdo), en cambio sí funcionará el resto de las veces. Y al contrario, si ponemos simplemente "%c", fucionará la primera vez, pero después se formará un bucle automático que no parará hasta que matemos el programa:

 

 

int funcion1()

{

    char letra;

    printf("Adivina la letra que estoy pensando");

    scanf("%*c%c" , letra); /*es mejor __fpurge(stdin) antes de scanf() sin "%*c"*/

    funcion2()

}

int funcion2()

{

    if (letra != 'A')

    {

        printf( "No has adivinado la letra que estaba pensando, vuelve a intentarlo");

        funcion1();

    }

    else

        printf("Enhorabuena, has acertado, la letra era la A");

}

 

Sin embargo funcionará perfectamente con __fpurge(stdin) antes de scanf().

Saludos!

+1
0
-1