Mi stupisce piuttosto che funzioni in qualche caso... la routine è banalmente sbagliata per il fatto che dopo aver chiamato la visita ti ritrovi ancora nella stessa posizione, per cui (ad esempio) la prima visita sullo stack delle chiamate si smazza comunque tutta la stringa, resettando c a 1 ogni volta che vede una parentesi. Inoltre, qualunque 'N' fornito da una sottochiamata a visita viene completamente ignorato.
Devi modificare la routine in modo che ogni chiamata a visita sposti il puntatore al carattere corrente fin dove arriva, e in modo che, se un check ad una chiamata nidificata fallisce, venga propagato fino al chiamante originario.

Inoltre:
- variabili di una sola lettera sono faticose da leggere;
- tutti quei parametri non servono a niente; ti basta il puntatore (doppio) a carattere (aggiornato man mano con la posizione corrente).