В духе взлома быстрых ответов, вот "sgets", которые я только что написал. Он пытается эмулировать fgets, но со строковым вводом.
Редактировать Исправлена ошибка, на которую указывал Монте (спасибо). Безумно печатая утилиту, полагая, что по крайней мере 15 других людей с точно такой же идеей отчаянно делают то же самое, это не приводит к хорошо протестированному коду. Плохо мне. Исходная версия включала символ новой строки в последующем вызове.
char *sgets( char * str, int num, char **input )
{
char *next = *input;
int numread = 0;
while ( numread + 1 < num && *next ) {
int isnewline = ( *next == '\n' );
*str++ = *next++;
numread++;
// newline terminates the line but is included
if ( isnewline )
break;
}
if ( numread == 0 )
return NULL; // "eof"
// must have hit the null terminator or end of line
*str = '\0'; // null terminate this tring
// set up input for next call
*input = next;
return str;
}
int main( int argc, char* argv[] )
{
// quick and dirty test
char *str = "abc\ndefghitjklksd\na\n12345\n12345\n123456\nabc\n\n";
char buf[5];
while ( sgets( buf, sizeof( buf ), &str ))
printf( "'%s'\n", buf );
}