scanf regex – C

Necesitaba leer una cadena hasta que se escriba la siguiente secuencia: \ nx \ n:

(.....)\n x\n 

\ n es el nuevo carácter de línea y (…..) puede ser cualquier carácter que pueda incluir otros \ n caracteres.

scanf permite expresiones regulares hasta donde yo sé, pero no puedo hacerlo para leer una cadena hasta este patrón. ¿Me pueden ayudar con la cadena de formato scanf?


Estaba intentando algo así como:

 char input[50000]; scanf(" %[^(\nx\n)]", input); 

pero no funciona.

scanf permite expresiones regulares hasta donde yo sé

Desafortunadamente, no permite expresiones regulares: la syntax es engañosamente cercana, pero no hay nada remotamente similar a la expresión regular en la implementación de scanf . Todo lo que hay allí es un soporte para clases de caracteres de expresiones regulares, por lo que %[] se trata implícitamente como []* . Es por eso que su llamada de scanf traduce en leer una cadena que consta de caracteres distintos de '(', ')', 'x', and '\n' .

Para resolver su problema, puede configurar un bucle que lea la entrada carácter por carácter. Cada vez que obtenga un '\n' , verifique que

  • Tienes al menos tres caracteres en la entrada que has visto hasta ahora,
  • Que el personaje inmediatamente anterior a '\n' es una 'x' , y
  • Que el personaje antes de la 'x' es otro '\n'

Si todo lo anterior es verdadero, ha llegado al final de su secuencia de entrada anticipada; de lo contrario, tu ciclo debería continuar.

scanf no admite expresiones regulares. Tiene un soporte limitado para las clases de personajes, pero eso no es para nada lo mismo.

Nunca use scanf , fscanf o sscanf , porque:

  1. El desbordamiento numérico desencadena un comportamiento indefinido . Se permite que el tiempo de ejecución de C bloquee su progtwig solo porque alguien haya tecleado demasiados dígitos.
  2. Algunos especificadores de formato (especialmente %s ) no son seguros exactamente de la misma manera que gets es inseguro, es decir, escribirán alegremente más allá del final del búfer provisto y bloqueará su progtwig.
  3. Hacen que sea extremadamente difícil manejar la entrada malformada de manera robusta.

No necesita expresiones regulares para este caso; lea una línea a la vez con getline y deténgase cuando la línea leída sea solo “x”. Sin embargo, las rutinas de biblioteca de expresiones regulares estándar (no ISO C, pero POSIX) se llaman regcomp y regexec .