другой способ ближе к исходной программе - просто заменить
if ((p[i] > 'z') && (p[i] > 'Z'))
на
if ((p[i] == 'z'+1) || (p[i] == 'Z'+1))
, чтобы избежать дублирования почти всего кода, как это это случай в другом ответе
И я думаю, что удобнее заменить
p[i] = p[i] - 26;
на
p[i] -= 'z' - 'a' + 1;
Компилятор заменяет 'z' - 'a' + 1
на его значение и выражение объясняет цель сама по себе
И до финиша sh Я думаю, что проще сделать
if (isalpha(p[i]))
{
if ((p[i] == 'z') || (p[i] == 'Z'))
p[i] -= 'z' - 'a';
else
p[i] += 1;
}
и удалить приращение бесплатно
или иметь только одну строку:
if (isalpha(p[i]))
p[i] += ((p[i] == 'z') || (p[i] == 'Z')) ? 'a' - 'z' : 1;
но это, вероятно, менее читабельно
Из них
printf("%c", p[i]);
стоит дорого и может быть заменен на
putchar(p[i]);