“Escriba un programa para copiar su entrada a su salida, reemplazando cada cadena de uno o más espacios en blanco por un solo espacio en blanco”.
Supongo que con esto se refiere a introducir algo como…
Nosotros(en blanco)(en blanco)(en blanco)Vamos(vacío)a(en blanco)(en blanco)(en blanco)la(vacío)¡centro comercial!
… y salida como:
Nosotros(vacío)Vamos(vacío)a(vacío)la(vacío)¡centro comercial!
Esto es probablemente más fácil de lo que estoy haciendo, pero aún así, parece que no puedo resolverlo. Realmente no quiero el código… más aún pseudocódigo.
Además, ¿cómo debería mirar esto? Estoy bastante seguro de que cualquier programa que escriba necesitará al menos uno variable
a while
bucle, un par if
declaraciones, y utilizará tanto el getchar()
y putchar()
funciones… pero además de eso estoy perdido. Realmente no tengo un tren de pensamiento de programadores todavía, así que si pudieras darme algún consejo sobre cómo debería considerar los “problemas” en general, sería increíble.
(Y por favor no menciones else
no he llegado tan lejos en el libro, así que ahora mismo eso está fuera de mi alcance).
carpintero mate
pseudocódigo
while c = getchar:
if c is blank:
c = getchar until c is not blank
print blank
print c
C
Puede sustituir el uso de isblank
aquí si lo deseas. No se especifica qué caracteres se crean en blanco o qué valor en blanco se imprimirá en lugar de otros.
Después de muchos puntos hechos por Matthew en los comentarios a continuación, esta versión y la que contiene isblank
son lo mismo.
int c;
while ((c = getchar()) != EOF) {
if (c == ' ') {
while ((c = getchar()) == ' ');
putchar(' ');
if (c == EOF) break;
}
putchar(c);
}
-
Simplemente pregunte si desea esto en sintaxis C.
– Matt Carpintero
22 de julio de 2010 a las 4:18
-
Una cosa que podría ayudar: este podría ser un buen momento para aprender sobre
ctype.h
si aún no lo sabes.ctype.h
contiene funciones para determinar el “tipo” de unchar
. Es decir, puede usarlo para ver si unchar
es una letra, un número, un espacio en blanco, etc. Si es demasiado para asimilar ahora, simplemente tome nota mental para más adelante para que no pierda el tiempo reinventando la rueda.– Miguel
22 de julio de 2010 a las 4:23
-
Emitirá un carácter basura (EOF) si el último carácter está en blanco.
– Mateo Flaschen
22 de julio de 2010 a las 4:40
-
@ Mateo: ¡Gracias! ¡Buena atrapada!
– Matt Carpintero
22 de julio de 2010 a las 4:48
-
@ssbrewster: Funciona porque el interior
while
declaración quema el exceso de espacios, antes de imprimir un solo espacio.– Matt Carpintero
28 de noviembre de 2012 a las 15:35
Esto es lo que conseguí:
while ch = getchar()
if ch != ' '
putchar(ch)
if ch == ' '
if last_seen_ch != ch
putchar(ch)
last_seen_ch = ch
-
Este es el algoritmo más fácil aquí IMO. ¡Bravo!
–Nick Rameau
14 de julio de 2016 a las 10:28
-
reemplazar
if ch == ' '
porelse
ya que solo puede ser espacio debido a la condición inversa anterior– Jean-François Fabre
♦22 de marzo de 2020 a las 20:23
Ino
Misma explicación con Matt Joiner, pero este código no usa break
.
int c;
while ((c = getchar()) != EOF)
{
if (c == ' ') /* find a blank */
{
putchar(' '); /* print the first blank */
while ((c = getchar()) == ' ') /* look for succeeding blanks then… */
; /* do nothing */
}
if (c != EOF) /* We might get an EOF from the inner while-loop above */
putchar(c);
}
-
Este es el algoritmo más fácil aquí IMO. ¡Bravo!
–Nick Rameau
14 de julio de 2016 a las 10:28
-
reemplazar
if ch == ' '
porelse
ya que solo puede ser espacio debido a la condición inversa anterior– Jean-François Fabre
♦22 de marzo de 2020 a las 20:23
patas de rana
Trabajé muy duro para encontrar una solución que usara solo el material que ya se cubrió en la primera parte del primer capítulo del libro. Aquí está mi resultado:
#include <stdio.h>
/* Write a program to copy its input to its output, replacing each string of one or more blanks by a single blank. */
main()
{
int c;
while ((c = getchar()) != EOF){
if (c == ' '){
putchar(c);
while ((c = getchar()) == ' ')
;
}
if(c != ' ')
putchar(c);
}
}
-
La segunda sentencia if puede ser reemplazada por un ‘else’, ya que si la primera condición es falsa, se sigue que c != ‘ ‘ es verdadera.
– Teo
19 mayo 2018 a las 17:20
-
No, no puede por una razón sutil: la llamada getchar() en el ciclo while interno habrá consumido el primer carácter que no esté en blanco al probar la condición del ciclo por última vez. Si no marca c antes de volver al ciclo while externo, perderá el primer carácter después de los espacios en blanco consecutivos.
– chisaipete
30 mayo 2018 a las 21:31
+1 por buen estado mental mientras aprendes.
– Alejandro C.
22 de julio de 2010 a las 10:59
no tengas miedo de
else
.else
es tu amigo. En realidad, todas las construcciones del lenguaje son tus amigos. Excepto los punteros. Ten miedo a los punteros.– Zano
22 de julio de 2010 a las 11:43
y teme al
goto
. Solo el mejor de sus trabajos sabe cuándo realmente hay un punto en el que usargoto
sería apropiado.– dhein
2 de noviembre de 2015 a las 13:20
Bueno, puede desarrollar un programa de forma iterativa y experimental: primero cree un programa trivial y luego agréguele funcionalidad. Otro enfoque es más sistemático: piense en los diferentes estados que encuentra su programa (en este caso: qué entrada actual y qué entrada anterior) y qué hará entonces. Usted puede estar interesado en diagramas de transición de estadoaunque más como una actitud.
– Peter – Reincorporar a Mónica
29 de febrero de 2020 a las 21:23