tag sirve questions que para negativos ingles estructura ejercicios ejemplos afirmativos c string char

c - negativos - tag questions para que sirve



¿Por qué tengo que repetir una oración de introducción? (4)

Intente esto: haga un archivo de data , dos bytes de tamaño que contengan precisamente ab . Ahora di:

./myprogram < data

Y voilá.

El punto es que cuando opera su terminal y presiona a seguido de la tecla Intro, está enviando dos caracteres al proceso, primero a y luego /n , la nueva línea. Entonces, el segundo getchar toma la nueva línea.

(Y su terminal no le permite enviar caracteres individuales sin presionar Enter, ya que tiene un buffer de línea que llena antes de enviar cualquier cosa).

En resumen, getchar es una primitiva de E / S pobre, y casi siempre deberías preferir los fgets para leer líneas enteras y procesarlas.

Quiero leer dos char, entonces hago el siguiente código:

main() { char a,b; printf("/nEnter the first char.. "); a=getchar(); printf("/nEnter the second char.. "); b=getchar(); b=getchar(); //<--I''ve to add this sentence because the previously doesn''t work printf("/nFirst char --> %c",a); printf("/nSecond char --> %c",b); }

El código no debería funcionar, pero lo hace. El resultado es el correcto:

Primer char -> z

Segundo char -> z (''z'' o el char allí quiero)

Si getchar() el segundo getchar() entonces la salida es:

Primer char -> z

Segundo char -> (Aquí no hay char)

¿Cómo puedo eliminar el segundo getchar() sin obtener ningún error?

Porque fflush(stdin) antes de getchar() no funciona.


Parece que la función getchar() deja el carácter de nueva línea en el búfer del teclado. Esto significa que el primer b=getchar(); lee un carácter de nueva línea y el segundo lee la entrada real que espera. Un enfoque más elegante sería ignorar el carácter de nueva línea si tiene una función de ignore() disponible.


Según lo indicado por las otras respuestas, el problema fue causado por el retorno del carro .

Hay muchas formas de resolver esto, algunas más complejas que otras. Por lo tanto, indicaré el método más simple que he encontrado:

Como el sitio web de GNU indica que la función más adecuada para esto es getc(stream) y cito:

Esto es como fgetc , excepto que es permisible (y típico) que se implemente como una macro que evalúa el argumento de flujo más de una vez . getc a menudo está altamente optimizado, por lo que suele ser la mejor función para leer un solo personaje .

Lo puse en práctica pero todavía tiene el problema de RC , así que imprimí el resultado de esta función y noté que devuelve 10 cuando CR . Después de esto intenté obtener funcionalidad y claridad para el código. Haciendo todo lo posible por esto, ahora mi código es el siguiente:

main() { char a,b; printf("/nEnter the first char.. "); if ((a=getc(stdin))==10) a=getc(stdin); printf("/nEnter the second char.. "); if ((b=getc(stdin))==10) b=getc(stdin); printf("/nFirst char --> %c",a); printf("/nSecond char --> %c",b); }

Y el buen resultado:

Primer char -> z

Segundo char -> z (''z'' o el char allí quiero)

Aprendí que todos los programas necesitan su propia solución, diferente a los demás, y esa es la razón (creo) para eso hay tantas funciones. Lo que puedo decir es "Siempre tengo que adaptar el programa. Tal vez esta oración me funcione, pero no está garantizado que funcione para otros códigos".

¡Gracias a todos los chicos que me ayudaron!


getchar () solo obtiene un char. newline toma un caracter, ergo necesitas el getchar () extra en tu codigo para obtener la entrada / salida deseada.