В первой программе int x = p*p;
переполнится, когда p
будет достаточно большим.
Во втором случае ваш scanf
читает символ новой строки (c = 10
), а ваша функция toDecimal
не имеет защиты для недопустимых символов, поэтому она возвращает данные мусора. Результат неверен для каждого ввода, независимо от количества цифр. Вместо этого используйте scanf(" %c",&c);
(обратите внимание на пробел), чтобы исправить это. Это заставит его игнорировать что-либо перед фактическим персонажем. В любом случае вам нужно внести серьезные изменения в код, чтобы проверить наличие недопустимых входных данных, плюс нет проверки на nr
, потенциально переполненной, если вы введете достаточно большое число.
Также, пожалуйста, узнайте, как использовать отладчик. Чтобы понять это, потребовалось буквально 5 секунд, достаточно времени, чтобы установить точку останова и сделать пару шагов.