Вот исправленная версия (в вики-сообществе я ничего не пропустил)
// caller must free() returned buffer string!
char* AddnewlinetoString(char *s)
{
size_t len;
char * buffer;
if (s == NULL)
s = "";
len = strlen(s);
buffer = malloc(len+2);
if (buffer == NULL)
abort();
strcpy(buffer,s);
buffer[len] = '\n';
buffer[len+1] = 0;
return buffer;
}
Как упоминает Тони, s может быть допустимым адресом, но все же быть искаженной c-строкой без нулевых байтов. Функция может закончить чтение до тех пор, пока не вызовет ошибку или другую ужасную вещь. Хотя это все еще идиоматический C, большинство людей предпочитают подсчитанные строки (а не завершенные нулем.)
// caller must free() returned buffer string!
char* AddnewlinetoStringN(char *s, size_t len)
{
char * buffer;
if (s == NULL)
s = "";
buffer = malloc(len+1); // only add 1 byte, since there's no need for the nul
if (buffer == NULL)
abort();
strncpy(buffer,s,len);
buffer[len] = '\n';
return buffer;
}