Этот код должен работать:
#define IMAGE_BACKGROUND "\\content\\images\\background.bmp"
int main(int argc, char* args[])
{
char buf[512];
int endOfPath = strrchr(args[0], '\\') - args[0];
strncpy_s(buf, sizeof(buf), args[0], endOfPath);
strcat(buf, IMAGE_BACKGROUND);
Как и другой человек, args [0] - это полный путь исполняемого файла, поэтому вы не можете использовать это как есть. Функция strrchr (TWO r в середине) находит последнее вхождение данного символа и возвращает указатель на него. Предполагая, что вы используете однобайтные символы, вычитание args [0] из возвращаемого указателя даст вам количество символов между двумя указателями. Когда вы вычитаете два указателя, вы фактически вычитаете адреса памяти, так что вы слева - смещение или расстояние между указателями. Это расстояние похоже на индекс найденного символа.
Затем я использую функцию strncpy_s, чтобы скопировать число символов endOfPath из args [0] в наш временный буфер. Теперь, если ваш путь к программе был
«C: \ Windows \ Users \ Me \ Desktop \ myProgram \ theProgram.exe»
переменная buf будет содержать
«C: \ Windows \ Users \ Me \ Desktop \ myProgram"
Затем я использовал функцию strcat (conCATenation), чтобы добавить вашу константу в конец.
Обратите внимание, что с #define, то «\\» ОБЯЗАТЕЛЬНА в C/C++, а также отмечают, что "знаки будут включены где-либо использовать IMAGE_BACKGROUND.
После этих строк кода, ЬиЕ будет содержать:
"C: \ Windows \ Users \ Me \ Desktop \ MyProgram \ содержание \ Images \ background.bmp"
Надежда, что помогает и не слишком запутанным ...
Я запускаю windows xp, я хотел бы иметь возможность получить папку моего исполняемого файла, чтобы я мог поддерживать подкаталог относительно моего исполняемого файла. –
Итак, есть ли лучший способ сделать то, что я пытаюсь сделать? Я использую Visual C++ Express, но я не думаю, что это было актуально. –