#c #system
#c #система
Вопрос:
Итак, вот код:
#include <iostream>
#include <string>
using namespace std;
int main(){
cout << "type dir" << endl;
string command;
cin >> command; //typed C:Java
const char* cml = ("cd C:" command).c_str();
system(cml);
cout << "[System]: Set!";
}
и вот результат:
'exe' is not recognized as an internal or external command,
operable program or batch file.
Если я просто наберу system («cd C:Java «);, тогда это работает. но если я передам символ const в системную функцию, как указано выше, я получаю сообщение об ошибке, что exe не реконструирован.
Комментарии:
1. Единственное отличие, которое я вижу из вашего поста, — это косая черта сзади?
2. Я предполагаю, что это windows. Выдает ли это аналогичную ошибку, если вы вызываете
system("echo hello")
.echo
встроен в интерпретатор команд по умолчанию (CMD
) — вызывается самой интерпретацией команды, а не отдельным исполняемым файлом. Если этот системный вызов не работает, либо ваша система неправильно настроена, либо она настроена на использование другого процессора командной строки, который работает не так, как вы ожидаете.
Ответ №1:
Это неопределенное поведение:
const char* cml = ("cd C:" command).c_str();
cml
Переменная инициализируется указателем C-string из std::string
возвращаемой в результате конкатенации. Однако этот результат является временной переменной, которая отбрасывается сразу после завершения этого оператора. Итак, указатель массива символов на by cml
уже освобожден после этой строки.
Следующее сохраняет результат конкатенации для использования в следующих операторах:
string cml = "cd C:" command
system(cml.c_str())
Комментарии:
1. Технически неопределенное поведение не возникает до тех пор, пока в следующей строке не будет использован висячий указатель