@SaddledSharp
Кодер. Увлекаюсь информационной безопасностью.

Как распределить строку на разные переменные?

Всем здравствуйте, у меня есть вывод от команды, код выглядит так:
char fileName[BUF] = { 0 };
    FILE *check = popen("ls *.py", "r"); 
    if (check != NULL) {
        while(fgets(fileName, BUF, check) != NULL) {
            puts(fileName);
        }
    }
    else {
        printf("Error!");
    }

Вывод от команды выглядит так:
file2.py

file3.py

file.py

( Прошу учесть эти двойные отступы )
Вопрос: как мне разделить каждое это слово на разные переменные? К примеру что бы я смог к ним обращаться вот так:
char* file1 = // Тут хранится первая строка, т.е "file2.py"
char* file2 = // Тут хранится вторая строка, т.е "file3.py"
// Обращение:
char result[BUF] = { 0 };
    FILE *com = popen(("cat %s", file1), "r");
    if (com != NULL) {
        while(fgets(result, BUF, com) != NULL);
    }
    else {
        printf("Error!");
    }
    fclose(com);

Вроде бы искал в гугле, но не смог найти. Находил функцию strtok() , но, походу, на Линуксе она не работает....
  • Вопрос задан
  • 67 просмотров
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега C
Седой и строгий
strtok прекрасно работает везде
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_TOKENS 3
#define DELIMITER "\n"

int main(int argc, char* argv[]) {
  char s[30] = "file2.py\n"
               "file3.py\n\n"  // Хоть одинарные, хоть двойные
               "file.py\n";
  char* tokens[MAX_TOKENS];

  char* token = strtok(s, DELIMITER);
  for (int i = 0; (token != NULL) && (i < MAX_TOKENS); i++) {
    tokens[i] = token;
    token = strtok(NULL, DELIMITER);
  }
  
  for (int i = 0; i < MAX_TOKENS; i++)
    printf("%s\n", tokens[i]);

  return EXIT_SUCCESS;
}
Ответ написан
myjcom
@myjcom
Не дождались, тогда тут.
коде

#include <stdio.h>
#include <string.h>

#define BUF 128

void doit(char* buf, char* cmd)
{
  char command[BUF] = {0};
  char cmdbuf[BUF] = {0};
  FILE* nextfp;
  char* filename = strtok(buf, " ");
  
  while(filename)
  {
    sprintf(command, "%s %s", cmd, filename);
    if((nextfp = popen(command, "r")) != NULL)
    {
      while(fgets(cmdbuf, BUF, nextfp) != NULL)
      {
        puts(cmdbuf);
      }
      pclose(nextfp);
    }
    filename = strtok(NULL, " ");
  }
}

void pipeline(FILE* fp, char* cmd)
{
  char buf[BUF] = {0};
  while(fgets(buf, BUF, fp) != NULL)
  {
    doit(buf, cmd);
  }
}

int main()
{
  FILE *check = popen("ls *.c", "r");

  if (check != NULL)
  {
    pipeline(check, "cat");
    pclose(check);
  }
  return 0;
}

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы