объединение строк в массив char в c (с использованием меньшего количества strcat)

#c #linux #string #char

#c #linux #строка #char

Вопрос:

Например, у меня есть такой код.

     char NameTmp[] = "foo.txt";
    char Name[] = "bar.txt"
    char cmd[80] = "./analyzeText ";
    strcat(cmd, Name);
    strcat(cmd, " ");
    strcat(cmd, NameTmp);
    strcat(cmd, " ");
    strcat(cmd, "8");
    system(cmd);
  

По сути, я пытаюсь вызвать «./analyzeText bar.txt foo.txt 8» в Linux в моей программе. analyzeText — это уже созданная программа, которая находится в той же папке.

Мне интересно, есть ли более короткий способ, чем использовать «strcat» для создания строк на c ?

Комментарии:

1. Если вы просто хотите вызвать другую программу, это похоже на работу для сценария оболочки. Есть ли какая-либо причина, по которой вы не можете использовать скрипт или хотите использовать C?

2. @dappawit: Вы делаете здесь довольно радикальные предположения. Может быть любое количество причин, по которым операционная система хочет выполнить системную команду изнутри приложения.

3. Да, вы правы. Когда я впервые увидел это, я прочитал это так, как будто он всего хотел вызвать другую программу. Я не думал, что это может быть в рамках более масштабной программы. Моя ошибка.

Ответ №1:

Используйте некоторые строки:

 std::string NameTmp = "foo.txt";
std::string Name = "bar.txt";
std::string cmd = "./analyzeText "   Name   " "   NameTemp   " 8";
system(cmd.c_str());
  

Это немного менее эффективно (создается больше строк), но намного проще.

Комментарии:

1. Это более эффективно, если это просто работает, и вам не нужно задавать вопросы об этом.:-)

Ответ №2:

 std::string cmd("./analyzeText ");
cmd  = Name;
// etc.
system(cmd.c_str());
  

Правильным аргументом для = может быть строка C ( const char * / литерал), std::string или один символ.

(Пожалуйста, никогда не используйте strcat в C ; это ненужно и небезопасно.)

Комментарии:

1. Могу я спросить, почему strcat небезопасен?

2. @js0823: strcat с радостью запишет запись поверх конечной строки или за конец буфера, поэтому, если вы не рассчитаете размер вашей конечной строки точно до последнего байта, это вызовет неопределенное поведение. = on std::string при необходимости выделит память за вас.

Ответ №3:

Да, используйте конструкции C :

 std::string nameTmp = "foo.txt";
std::string name    = "bar.txt";
int param = 8;

...

std::stringstream ss;
ss << "./analyzeText " << name << " " << nameTmp << " " << param;
system(ss.str().c_str());
  

Я предполагаю, что имена и параметр являются переменными во время выполнения. Очевидно, что если это не так, то вы можете заменить соответствующим образом.