Problema en un formulario do-while en Strings

Ok, soy un estudiante en sus primeras experiencias con la programación, así que sé amable;) este es el código correcto para imprimir "n" veces una cadena en la pantalla...

#include <stdio.h>
#include <string.h>

#define MAX 80+1+1 /* 80+\n+\0 */

int main(void)
{
  char message[MAX];
  int i, n;

  /* input phase */
  printf("Input message: ");
  i = 0;
  do {
    scanf("%c", &message[i]);
  } while (message[i++] != '\n');
  message[i] = '\0';

  printf("Number of repetitions: ");
  scanf("%d", &n);

  /* output phase */
  for (i=0; i<n; i++) {
    printf("%s", message);
  }

  return 0;
}

¿Por qué en el formulario do-while necesita verificar si mensaje[i++] != '\n' y no solo mensaje[i] != '\n'??

preguntado el 22 de mayo de 12 a las 08:05

2 Respuestas

La forma correcta de escribir ese bucle de entrada es, en mi opinión, algo así como:

fgets(message, sizeof message, stdin);

en otras palabras, no use un bucle de carácter por carácter, simplemente use la función de la biblioteca estándar que lee una cadena terminada en una nueva línea y listo.

contestado el 22 de mayo de 12 a las 09:05

La do { ... } while(...) bucle en su código lee los caracteres uno a la vez y los almacena en message. El índice del siguiente carácter es uno más que el índice del carácter anterior, por eso debemos aumentar la variable de índice i después de almacenar el carácter actual. El algoritmo es:

  1. Lee el siguiente carácter y guárdalo en message[i].
  2. Si este personaje es '\n', Salida.
  3. Incrementando i y vaya a 1.

La expresion message[i++] incrementos i después de que se usó como un índice en message, de modo que la próxima vez miraremos el siguiente carácter de la cadena. Entonces, while (message[i++] != '\n') combina los pasos 2 y 3.

Lo mismo en for-círculo:

int i;
for (i = 0; scanf("%c", &message[i]) && message[i] != '\n'; ++i);

Pero como señaló @unwind, es mejor no usar la entrada char-by-char.

contestado el 22 de mayo de 12 a las 09:05

Gracias por la respuesta;) no soy un "amante" del bucle do-while... ¿es posible usar un bucle "for"? - Lc0rE

¿Qué pasa con scanf("%s", &mensaje)? - josip

@JosiP: no permite leer una cadena que contiene espacios. - alex bakulín

Hola chicos, ¿pueden sugerirme algún recurso útil en línea para aprender C? - Lc0rE

La mejor manera de aprender C es leer "El lenguaje de programación C" de Kernighan y Ritchie. Dudo que haya recursos en línea que sean tan útiles. - alex bakulín

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.