Почему бы просто не использовать sscanf
класс символов спецификатор формата "%[^\n]"
для чтения имени, например,
if (sscanf (str, "%7s %7s %d %63[^\n]", loc, dir, &len, name))
printf ("loc : %s\ndir : %s\nlen : %d\nname: %s\n", loc, dir, len, name);
ширина поля модификатор должен использоваться с любым преобразованием строк, или sscanf
не лучше, чем gets()
. Ширина будет соответствовать следующим объявлениям, например
char str[] = "D4 E 3 NullByte Sub",
loc[8], dir[8], name[64];
int len;
Полный пример будет:
#include <stdio.h>
int main (void) {
char str[] = "D4 E 3 NullByte Sub",
str2[] = "D4 E 3 NullByte Sub Ship Barrier",
loc[8], dir[8], name[64];
int len;
if (sscanf (str, "%7s %7s %d %63[^\n]", loc, dir, &len, name))
printf ("\nloc : %s\ndir : %s\nlen : %d\nname: %s\n", loc, dir, len, name);
if (sscanf (str2, "%7s %7s %d %63[^\n]", loc, dir, &len, name))
printf ("\nloc : %s\ndir : %s\nlen : %d\nname: %s\n", loc, dir, len, name);
}
Пример использования / Вывод
$ ./bin/sscanf_loc-dir-name
loc : D4
dir : E
len : 3
name: NullByte Sub
loc : D4
dir : E
len : 3
name: NullByte Sub Ship Barrier