Estou tendo problemas com argumentos em programas de console C++ criados no C++Builder 12 Community Edition.
Se o executável estiver em uma pasta com espaços no nome, por exemplo, "test dir"
, e eu o invoco de uma sessão de console em uma pasta DIFERENTE, então os argumentos extraídos pelo meu código estão incorretos. Se o caminho do arquivo executável não tiver espaços, tudo funciona bem. Se eu executá-lo dentro do IDE, também está OK. O código criado no Visual Studio 22 também funciona OK.
CPPtest.cpp
#include <iostream.h>
int main(int argc, char* argv[])
{
cout << "argc: " << argc << "\n";
cout << "argv0: " << argv[0] << "\n";
cout << "argv1: " << argv[1] ;
return 0 ;`
}
O executável está localizado em um diretório chamado "Misc projects"
, CWD é "C:\Junk"
:
C:\Junk>C:\"Misc projects"\CPPtest 3 8
argc: 2 ## INCORRECT: Should be 3
argv0: c:\Misc projects\CPPtest.exe
argv1: projects\CPPtest 3 8 # INCORRECT should be 8
Código idêntico quando executado dentro do Visual Studio 22 funciona corretamente.
Você está citando o caminho do arquivo incorretamente. Como você não está escapando os separadores de diretório no seu caminho, o caminho inteiro do arquivo deve ser citado, não apenas a parte com o espaço.
O programa está em execução, mas o comportamento padrão da análise de argumentos , que divide com base em espaços, resulta nas seguintes strings literais:
C:"Misc
projects"\CPPtest 3 8
A primeira aspa está sendo inadvertidamente escapada pelo seu separador de diretório sem escape (
\"
), e não conta mais como uma aspa. A segunda aspa (que é literalmente sua primeira e única aspa agora) não está fechada, o que significa que tudo o que a segue é tratado como uma string com aspas simples. Portanto, o primeiro espaço está causando uma primeira divisão, e os espaços restantes são ignorados devido ao"
que não está fechado. Esta é uma das razões pelas quais os separadores de caminho do Windows são escapados\\
.Quanto ao comportamento diferente com base no contexto de execução:
Ao invocar o aplicativo do mesmo diretório do executável, é bem provável que o caminho completo seja omitido quando você o executa, eliminando assim todo o problema de escape/aspas/espaços:
Ao depurar por meio do VS, o caminho do arquivo executável é escapado corretamente como parte da tarefa de inicialização de depuração, portanto, o caminho do arquivo não tem importância.
Na minha experiência com programação C# CLI, o nome do executável é, na verdade, excluído completamente dos argumentos do programa quando executado no contexto do depurador.