Stringi w C++ doskonale wiedzą jakie są długie. Mają od tego metodę .size() (lub length). Taki kod już powinien przejść:
#include <iostream>
#include <string>
using namespace std;
int main()
{
char alfabet[] =
{
'A', 'B', 'C', 'D' , 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R','S','T', 'U', 'V', 'W', 'X', 'Y','Z' };
string wyraz;
while (getline(cin, wyraz))
{
for (int i = 0; i < wyraz.length(); i++)
{
if (wyraz[i] == 'X' || wyraz[i] == 'Y' ||
wyraz[i] == 'Z' || wyraz[i] == ' ')
{
if (wyraz[i] == 'X') cout << 'A';
if (wyraz[i] == 'Y') cout << 'B';
if (wyraz[i] == 'Z') cout << 'C';
if (wyraz[i] == ' ') cout << ' ';
}
else
{
int j = 0;
while (wyraz[i] != alfabet[j])
{
j++;
}
cout << alfabet[j + 3];
}
}
cout << endl;
}
return 0;
}
Mam jeszcze kilka uwag technicznych. Masz tablicę charów, a string to to samo a nawet lepiej. Uprościłbyś znacznie zapis:
string alfabet = "ABCDEF....";
Spróbuj też wykonać to zadanie korzystając z tablicy ASCII (to jeszcze uprości zadanie, a przy okazji nauczysz się czegoś nowego) ;)