Quiero ingresar una oración (que contenga cualquier carácter posible) e imprimirla. Pero hay una trampa. Si hay una \n en la oración, solo se debe imprimir la parte de la oración antes de \n (es decir, \n debe significar el final de la oración ingresada). Escribí un código para esta situación:

#include <stdio.h>
main()
{
    char ch[100];
    printf("Enter a sentence");
    scanf("%99[^\\n]",&ch);
    printf("%s",ch);
}

Este código parece funcionar bien pero falla en una determinada situación. Si hay el carácter n en cualquier lugar de la oración antes de \n, ¡imprime solo la primera palabra de la oración! ¿Por qué pasó esto? ¿Cómo puedo solucionar este error?

Este caso funciona bien: ingrese la descripción de la imagen aquí

Pero en este caso falla:

enter image description here


Detalle de los comentarios:

P: ¿Desea detenerse en una nueva línea o en una barra invertida seguida de n?
A: barra inclinada seguida de n

1
user7313260 18 ago. 2017 a las 18:23

2 respuestas

La mejor respuesta

El especificador de conversión [] de scanf() funciona definiendo un conjunto de caracteres aceptado (o, con ^, rechazado). Entonces, %[^\\n] dejará de escanear en el primer \ o el primero n -> No puedes resolver tu problema con scanf().

Debería leer una línea de entrada con fgets() y buscar una aparición de "\\n" con strstr().


Nota al margen: hay un error en su programa:

char ch[100];
scanf("%99[^\\n]",&ch);

ch se evalúa como un puntero al primer elemento de la matriz (por lo tanto, estaría bien como parámetro para scanf()), mientras que &ch se evalúa como un puntero a la matriz , que no es lo que espera scanf().

(la diferencia está en el tipo, la dirección será la misma)

2
18 ago. 2017 a las 15:36

OP calcificación negó la primera parte de esta respuesta.


OP no ha formado el conjunto de exploración deseado para el especificador "%[...]".

"%99[^\\n]" acepta cualquier carácter excepto '\\' y 'n'.

Ciertamente OP quiere "%99[^\n]". \\ cambió a \ para aceptar cualquier carácter excepto '\n'.


Sin embargo, me gustaría aumentar un poco la meta. Esta parte es solo para código pedante.

ingrese una oración (que contenga cualquier carácter posible)

¿Cómo manejaría el código esto si el carácter nulo '\0' estuviera incluido en ese "cualquier carácter posible"?

Tenga en cuenta que ingresar un carácter nulo no suele ser fácil desde un teclado.

Es interesante que "%99[^\n]" escanee hasta 99 caracteres (excepto un '\n') incluido el carácter nulo . Sin embargo, el siguiente código imprime ch como si fuera una cadena y no una matriz general de caracteres.

#include <stdio.h>
int main(void) {
    char ch[100];
    printf("Enter a sentence\n");
    if (scanf("%99[^\n]", ch) != 1) {
      ch[0] = '\0';  // Handle a line of only `'\n``, EOF, or error
    }
    printf("%s",ch);
}

Para lograr este objetivo esotérico con scanf() (no es la mejor herramienta en el cobertizo), registre la duración del escaneo y luego imprima la matriz.

int main(void) {
    char ch[100];
    int n;
    printf("Enter a sentence\n");

    if (scanf("%99[^\n]%n", ch, &n) != 1) {
      n = 0; // If scanning stopped right away, set length `n` to 0
    }
    // Write as an array
    fwrite(ch, sizeof ch[0], n, stdout);
}
1
chux - Reinstate Monica 18 ago. 2017 a las 16:13