#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
с радостью запишет запись поверх конечной строкиили за конец буфера, поэтому, если вы не рассчитаете размер вашей конечной строки точно до последнего байта, это вызовет неопределенное поведение.
=
onstd::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());
Я предполагаю, что имена и параметр являются переменными во время выполнения. Очевидно, что если это не так, то вы можете заменить соответствующим образом.