Цитата(Метценгерштейн @ Nov 17 2014, 21:08)

давайте разбираться.
переменная z1.
Я ее объявляю типом int. Не хочу ее прямо там инициализировать. Почему нет? Инициализирую, когда мне это надо. Что здесь не так?
Предположим, что первый байт в строке равен 100. Вы входите в цикл
for (int i = 0; i < sizeof(str); i++)
и условие
if (str[i] == ',') z1 = i; // запомнили где запятая (начало слова)
у вас, естественно, не выполняется, т.к. код 100 это не запятая,
а следовательно, переменная z1 так и остается неинициализированной.
Но на этом нулевой цикл по i не закончился, а продолжается дальше.
Входим в условие
if ((str[i] >= 97) & (str[i] <= 122))
и обнаруживаем, что оно верно, т.к. 100 где-то между 97 и 122. А потому входим во второй цикл
for (int f = 0; f < 5; f++)
где на каждом обороте требутся проверить условие
if ((str[(z1 + 1 + f)]) == ',') // дошли до второй запятой
с котором фигурует символ
str[(z1 + 1 + f)]),
доставаемый по вычисляемому индексу
z1 + 1 + f
А как его вычислять, если z1 до сих пор неинициализирована?
Напоминаю, что мы всё еще находимся в состоянии, когда
i==0, f==0, str[0]==100,
а z1==неопределена, т.к. запятой еще не было.
Потом цикл по f попрет дальше до 5, заставляя лазить в память
str[(z1 + 1 + f)]),
где z1 по-прежнему неинициализирована. А поскольку условие
if ((str[(z1 + 1 + f)]) == ',') // дошли до второй запятой
в запредельной памяти он едва ли найдет, то цикл f на каждом своем обороте будет распечатывать это:
char c = str[(z1 + 1 + f)];
printf("%c", c);
где переменная "c" копирует в себя значение из массива с больным индексом.