Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++ Builder - char* в string

65K
25 мая 2015 года
alexusankov
3 / / 23.03.2013
Добрый день, товарищи. Сто лет за С++ не сидел, NET совсем мозги испортил.
Ситуация такова - надергал по кускам код из Сети, выводит в сообщении имя собственного исполняемого файла :
 
Код:
WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    lpCmdLine = GetCommandLine();
    char *ThisMyName = &lpCmdLine[0];
    MessageBox(0,ThisMyName,"exe", MB_OK);
    return 0;
}
Вопросов целых четыре :
1. Во первых что за жесть происходит с указателями? На мой замыленный взгляд, указателю на переменную типа char передается некий адрес в памяти, который в дальнейшем уходит в MessageBox. Так каким образом MessageBox выводит целую строку, если в качестве аргумента ему передается адрес на переменную типа char?
2. Что значит &lpCmdLine[0];, а именно знак амперсанда?
3. Коим образом мне чудо значение char *ThisMyName, привести в тип строки (string или char)?
Дело в том, что мне нужно получить именно имя файла, а мой маленький код выводит полный путь. Учитывая, что я в упор не понимаю, что есть char *ThisMyName, я не могу его распарсить.
Заранее спасибо.
446
26 мая 2015 года
Meander
487 / / 04.09.2011
Ответы на Ваши вопросы написал в комментах
Код:
#include <windows.h>
#include <cstring>
#include <string>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  //Вспомогательные переменные
  //char *buffer;//Для buffer = &lpCmdLine[0];
  char buffer[MAX_PATH];//Для GetModuleFileName и для std::strcpy
  char drive[_MAX_DRIVE];
  char dir[_MAX_DIR];
  char fname[_MAX_FNAME];
  char ext[_MAX_EXT];
 
  //Получаем полный путь
  lpCmdLine        = GetCommandLine();// стр1

  //амперсанд - оператор взятия адреса объекта
  //таким образом указатель на char будет содержать
  //адрес первого элемента массива lpCmdLine
  //Собственно ThisMyName - есть строка в стиле Си,
  //признаком ее завершения является \0
  //buffer = &lpCmdLine[0];
 
  //Мжно копировать так:
  std::strcpy (buffer, lpCmdLine);//cstring стр2
 
  //Или второй способ получения полного пути (закомментировать стр1 и стр2)
////  GetModuleFileName(hInstance,buffer,MAX_PATH);

 
  //Разделяем полный путь на составляющие
  _splitpath( buffer, drive, dir, fname, ext );//stdlib.h
 
  //Можно использовать строки
  std::string str_fname (fname);
  std::string str_ext (ext);
  std::string str_full = str_fname + str_ext;

  //MessageBox(
  //"дескриптор родительского окна",
  //"текст сообщения",
  //"заголовок окна сообщения",
  //"характер окна сообщения")
  MessageBox(0,str_full.c_str(),"exe", MB_OK);
  return 0;
}
1
27 мая 2015 года
kot_
7.3K / / 20.01.2000
Цитата:
//Можно использовать строки

НУЖНО использовать строки.
Использовать строки в С-стиле тут нет никакой необходимости.

7
03 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Трушный способ — это через GetModuleFileName(), там ещё можно в качестве 1-го параметра 0 указать, если мне память ни с кем не изменяет (проверил — не изменяет :)). В данном случае не придётся парсить командную строку и искать, где там параметры, а где — путь к модулю. Более того, в командной строке может не быть полного пути к файлу.
Перечитал и понял, что нужно именно имя файла, а не полный путь. Тогда PathFindFileName в помощь.
По поводу
 
Код:
char *ThisMyName=&lpCmdLine[0];
— это излишество, на мой взгляд. lpCmdLine у нас типа LPTSTR, а это и есть char*; т.е. можно написать просто так
 
Код:
char *ThisMyName=lpCmdLine;
Чтобы преобразовать в string, надо сделать так
 
Код:
#include <string>
char *szFullPath;
string sFileName;

sFileName=PathFindFileName(szFullPath);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог