Du musst prüfen, ob cin << zahl; überhaupt die eingabe verarbeiten konnte. Wenn der eingegebene Wert wie beispielsweise ein Buchstabe nicht in eine Zahl umgewandelt werden kann, kann in der Variable zahl auch nichts sinnvolles stehen. Der eingebene Wert ist offensichtlich ungleich eins, und somit wird immer b ausgegeben. Die Endlosschleife entsteht, weil er erneut versucht die Eingabe zu lesen, und diese wieder ungültig ist.
Nach einer Eingabe musst du also vor der Verarbeitung der Werte prüfen, ob diese eingelesen werden konnten. Dazu kannst du beispielsweise prüfen, ob cin.fail() false ist. Dann kannst du den Wert verwenden.