Вам нужно решить, где будет выделено хранилище для двух имен файлов, и как вы узнаете, сколько места предоставляется.
static void find_filename(const char *str, char *name)
{
char c;
while ((c = *str++) != '\0' && isspace((unsigned char)c))
;
if (c != '\0')
{
*name++ = c;
while ((c = *str++) != '\0' && !isspace((unsigned char)c))
*name++ = c;
}
}
int find_io_redirection(const char *str, char *in, char *out)
{
const char *lt = strchr(str, '<');
const char *gt = strchr(str, '>');
if (lt != 0)
find_filename(lt+1, in);
if (gt != 0)
find_filename(gt+1, out);
return(lt != 0 && gt != 0);
}
Этот код просто предполагает, что вы предоставляете достаточно большие строки для in
и out
.Если вы хотите быть более безопасным, то вы сообщаете функции (ам), насколько велика каждая целевая строка.Вы можете сжать этот код.Вы можете решить, что хотите вернуть количество перенаправлений.Вы можете решить, что вам следует знать о двойном перенаправлении вывода или двойном перенаправлении ввода.Вы можете решить, что должны вернуть битовую маску, указывающую, какие перенаправления присутствовали.Со значительно более сложным интерфейсом вы могли бы указать, какие части строки ввода представляют перенаправление ввода / вывода;это поможет вызывающей функции решить, какие части строки теперь следует игнорировать.
Вы бы использовали приведенный выше код, например, так:
char buffer[MAXCMDLEN];
char in[MAXFILENAMELEN];
char out[MAXFILENAMELEN];
if (fgets(buffer, sizeof(buffer), stdin) != 0)
{
if (find_io_redirection(buffer, in, out))
...process buffer know that I/O redirection is present...
else
...witter about missing I/O redirection...
}