Есть несколько недостатков.
Первый - неправильное объявление переменных length
и i
, которые объявлены как имеющие тип char
.
char *s, length, i;
Они не могут хранить значение выше 127
или 255
в зависимости от того, ведет ли тип char
к типу signed char
или unsigned char
.
Они должны быть объявлены как имеющие тип size_t
- возвращаемый тип функции strlen
Фактически вызов этой функции является избыточным. Вы можете положиться на конечный ноль входной строки.
Нет необходимости динамически выделять и перераспределять массив. Вы можете объявить массив с автоматическим c сроком хранения.
Между подстроки строки могут быть последовательные пробелы. Вы не обрабатываете такие случаи.
Обратите внимание на то, что вывод подстрок строки означает изменение самой строки.
Вот демонстрационная программа, которая показывает, как задача может
#include <stdio.h>
#include <string.h>
int main(void)
{
enum { N = 1001 };
char s[N] = "";
fgets( s, sizeof( s ), stdin );
const char *delim = " \t\n";
for ( const char *p = s; *p; )
{
p += strspn( p, delim );
int n = strcspn( p, delim );
if ( n ) printf( "%*.*s\n", n, n, p );
p += n;
}
return 0;
}
Если ввести, например, следующую строку " Hello Gautam Goyal"
, то вывод программы будет
Hello
Gautam
Goyal