Вы должны иметь строку как
char str[]="\"command1\";\"sleep 30; command2 -a ; command3\";\"command4=\"MyTest\"\"";
Вам не нужно использовать strtok()
можно использовать sscanf()
как
char a[3][100];
sscanf(str, "\"%99[^\"]\";\"%99[^\"]\";\"%99s", a[0], a[1], a[2]);
a[2][strlen(a[2])-1]='\0';
printf("\n%s\n%s\n%s", a[0], a[1], a[2]);
Последний a[2]
будет иметьдополнительные "
в конце этого пути.Мы удаляем его с помощью a[2][strlen(a[2])-1]='\0';
.
\"%[^\"]\"
означает прочитать "
, прочитать все до следующего "
(эта часть хранится в массиве символов) и прочитать также "
.
Спецификаторы ширины используются в sscanf()
для предотвращения переполнения буфера.
Вы должны проверить, успешно ли sscanf()
, проверив его возвращаемое значение, например
if( sscanf(........) != 3)
{
printf("\nSomething went wrong.");
}
sscanf()
возвращает количество успешных назначений, которое в этом случае должно быть 3
.
Выходные данные:
command1
sleep 30; command2 -a ; command3
command4="MyTest"
Редактировать:
Размер массива 100был произвольным.Если требуется более точное распределение памяти, вы можете сначала использовать динамическое распределение памяти.Как и
sscanf(str, "\"%*[^\"]%n\";\"%*[^\"]%n\";\"%*s%n", &size[0], &size[1], &size[2]);
printf("\n%d, %d, %d", size[0], size[1], size[2]);
size[2] = size[2]-size[1]-4;
size[1] = size[1]-4;
size[0] = size[0]-1;
char *p[3];
for(int i=0; i<3; ++i)
{
if( (p[i]=malloc(sizeof(char)*size[i]))==NULL )
{
perror("Memory allocation failed!");
return 1;
}
}
Спецификатор формата %n
возвращает количество прочитанных символов.См. этот пост.
А *
для подавления.т.е. значения просто отбрасываются.Это дополнительное scanf()
делается для получения размеров строк.
Но это специфично для этого ввода.