Tu initialises tes variables cpt et cpt2 a 1 avant la première boucle.
La condition cpt2 <= lig est bien vérifiée, donc tu rentres dans le premier WHILE.
La condition cpt <= cara est vérifiée, donc tu rentres dans le second WHILE.
Tu fais les printf de tes étoiles, et tu sors du second WHILE.
A ce moment là, ta variable cpt2 vaut 1 (premier passage de boucle) et ta variable cpt est supérieure a cara.
Tu refais un tour de boucle dans ton premier WHILE puisque la condition de celui-ci est toujours vérifiée, mais vu que cpt est supérieure a cara, tu ne rentreras plus jamais dans le WHILE imbriqué.
Tu as donc 2 solutions :
-remplacer tes WHILE par des FOR : un for réalise 3 instructions, a savoir la vérification de la condition, l'initialisation de(s) variable(s) a chaque premier tour de boucle et l'incrémentation de celle(s)-ci.
-garder ton code, mais remettre a 1 ta variable cpt après la sortie de ton second WHILE.