Вы возвращаете указатель на локальную переменную («буфер»), это неверно, и я удивлен, что вы не получили предупреждение об этом.
При выходе из функции все локальные переменные перестают существовать (это называется выходом из области видимости), и их память будет использоваться для других целей. Вы возвращаете указатель на эту память, но нет никакой гарантии, что теперь там будет.
В этом случае кажется, что во время вызова printf память содержит 0, который рассматривается как пустая строка. Это на самом деле довольно удачно, вы можете легко получить либо распечатку мусора, либо сбой программы.
Чтобы решить эту проблему, вы можете либо передать буфер в czas, либо сделать так, чтобы czas выделил буфер в куче, которую вы позже освободите. Я бы порекомендовал первый, потому что он соответствует тому, как работают практически все библиотечные функции. Это также позволяет избежать выделения памяти, когда вызывающая сторона должна позднее освободить указатель.
например:
size_t czas(char* buffer, size_t buffer_size)
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
return strftime (buffer, buffer_size,"Now it's %I:%M%p.",timeinfo);
}
int main()
{
char buffer [80];
if (czas(buffer, 80))
{
printf("%s\n",buffer);
}
else
{
printf("Call to czas failed");
}
system("PAUSE");
}
Обновление: я не заметил, что strftime принял параметр размера, я обновил код для его использования и правильно передал результат из strftime. В результате это намного надежнее, и вы не можете случайно переполнить буфер.