Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

201
Vistas
Is the format specifier %[^\n]s legal in C89?

I'm reading a string from sdin with a scanf by doing:

scanf("%[^\n]s", msg);

%[^\n]s reads till a new line character is found. Is this legal in ANSI-C?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

You should not use this format for multiple reasons:

  • The s in "%[^\n]s" is not part of the conversion specifier, it is a plain character that scanf will try to match after the characters read from the line, at a time where the current character is either a newline or the end of file. You should remove the s.

  • scanf("%[^\n]", msg); will fail and return 0, leaving msg unchanged if the user hits enter with an empty input line.

  • scanf("%[^\n]", msg); will cause a buffer overflow for any sufficiently long input line. The maximum number of characters to store into the array pointed to by msg should be specified between the % and the [ as:

      char buf[100];
      if (scanf("%99[^\n]", msg) == 1) {
          // msg contains the input line, up to 99 characters
          // the remainder if this input line is still in stdin
          // so is the newline
      }
    
  • scanf("%99[^\n]", msg); does not consume the newline and leaves extra characters in the input stream if more than 99 were typed before the newline, which may of may not be the expected behavior.

Here is a safer alternative:

// read a line of input, discard extra characters and the trailing newline
int mygets(char *dest, size_t size) {
    int c;
    size_t i = 0;
    while ((c = getchar()) != EOF && c != '\n') {
        if (i + 1 < size) {
            dest[i++] = c;
        }
    }
    if (size > 0)
        dest[i] = '\0';
    if (c == EOF && (i == 0 || ferror(stdin)))
        return EOF;
    else
        return (int)i;
}
over 4 years ago · Santiago Trujillo Denunciar

0

Is the format specifier %[^\n]s legal in C89?

Yes, it's "legal", as in the behavior will be defined.

The %[^\n] will scan anything except a newline character. s will scan an s. s will never match, because there will be a newline in the buffer, or an error condition. Still, it's "valid".

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda