Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите извлечь 1-ый параметр из командной строки 
V
    Опции темы
586
Дата 5.8.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Код
char szCmd[]="cmd.exe /k \"cd C:\\\"";

Нужно извлечь первый параметр, т.е. он должен быть "cmd.exe". Может, для этого какая нибудь функция есть?

ЗЫ  CommandLineToArgvW не предлагать
PM   Вверх
MAKCim
Дата 5.8.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

strtok(szCmd," ");



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
586
Дата 5.8.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



MAKCim, если всё бало так легко, я бы не писал  smile 

Ведь строка может быть и такая:

char szCmd[]="\"C:\\Program files\\test.exe\" -p -n";
PM   Вверх
MAKCim
Дата 5.8.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



так тебе в строке надо найти конкретное имя файла или парсить строку с определенным разделителем? 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
586
Дата 5.8.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Мне нужно получить в итоге "C:\Program files\test.exe".
Просто хочу знать, есть ли такая функция, чтобы не изобретать велосипед.
PM   Вверх
apook
Дата 5.8.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Елементарно

Код

/* программа выведет имя запускаемого файла com или exe
который первым будет найден в строке dest */

#include "string.h"
#include "stdio.h"

int main(void)
{
char *dest = "\"C:\\Program files\\test.com\" -p -n";

strtok(dest, "\"\\ ");

for(; !strstr(dest, ".exe") && !strstr(dest, ".com"); )
     {
      if (dest) dest = strtok(NULL, "\"\\ ");
      else    break;
          }    
printf("%s\n", dest);
return 0;
}



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
586
Дата 5.8.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Хорошо, а если неизвестно, есть кавычки, или нет. А если строка неправильного формата - надо это определить.
PM   Вверх
vinter
Дата 5.8.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56




Конкретной ф-ии конечно же нет...
Цитата

А если строка неправильного формата - надо это определить.

Откуда строка получается??Сам задаешь или откуда то получаешь???




--------------------
Мой блог
PM MAIL WWW   Вверх
586
Дата 5.8.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Сам задаю.
PM   Вверх
vinter
Дата 5.8.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Тут наковрял небольшую программку, вычленяет путь типа С:\....\*.расширение 
Код

#include<iostream>
using namespace std;
int main()
{
    char szCmd[]="\"vbvcbC:\\Program files\\,,\|test.exe\" -p -n";
    char *strHelp;
    strHelp = new char[strlen(szCmd)+1];
    for(int i = 0; i<(strlen(szCmd)+1) ; i++)
    {
        if(szCmd[i] == ':')
        {
            i--;
            strHelp[0] = szCmd[i];
            strHelp[1] = szCmd[i+1];
            i += 2;
            for(int j = 2;;  i++)
            {
                if(isalpha(szCmd[i]) || (szCmd[i] == ' ') || ((szCmd[i] == '\\') && (szCmd[i-1] != '\\')))
                {
                    strHelp[j] = szCmd[i];
                    j++;
                    strHelp[j] = '\0';
                }
                if(szCmd[i] == '.')
                {
                    for(int k = 0; k<4; k++, j++, i++)
                       strHelp[j] = szCmd[i];
                    strHelp[j] = '\0';
                    break;
                }
            }
            break;
        }
        
    }
    cout << strHelp <<endl;
    cin.get();
    return 1;
}

Можно в принципе сделать так чтобы из строки совершенно бредовой собирало полный путь ,но это уже тяжелее

Это сообщение отредактировал(а) vinter - 5.8.2006, 18:15


--------------------
Мой блог
PM MAIL WWW   Вверх
MoZy
Дата 5.8.2006, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: нет
Всего: 0



Ручками, ручками )) Иногда полезно знать как устроен велосипед.
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 6.8.2006, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Вот сделал небольшой велосипед. Едет вроде нормально  smile 
Код
#include <windows.h>
#include <iostream.h>
#include <conio.h>

BOOL __stdcall ExtractArgv1(const char *pstr, char *b)
{
 BYTE bt=0;
 int i, ii=0, l=lstrlen(pstr);
 if(pstr==0 || l==0) goto err;
 for(i=0; i<=l; i++)
 {
  if((!(bt & 1)) && (pstr[i]==' ')) 
  { ii++; continue; }
  else bt|=1;
  if(pstr[i]=='"')
  {
   if(bt & 4) break;
   b[i-ii]=pstr[i];
   if(bt & 2){b[i-ii+1]=0; return 1;}
   else bt|=2;
  } else {
   if(!(bt & 2))
   {
    if(pstr[i]==' ' || pstr[i]==0){b[i-ii]=0; return 1;}
    bt|=4;
   }
   if(!pstr[i])
    if(bt & 2) break;
    else return 1;
   b[i-ii]=pstr[i];
  }
 }
err:
 b[0]=0;
 return 0;
}

void Test(char *pstr)
{
 cout<<"Source line: "<<pstr<<endl;
 char buff[260];
 if(!ExtractArgv1(pstr, buff))
    cout<<"BAD LINE";
 cout<<buff<<endl<<endl;
}

int main(int, char**)
{
    Test("cmd");
    Test("cmd.exe");
    Test("cmd.exe /k /t /s aaaa");
    Test("cmd.exe /k cd \"C:\\Program files\"");
    Test("\"C:\\Program Files\\test.exe\"");
    Test("\"C:\\Program files\\test.exe\" testparam");
    Test("\"C:\\Program files\\test.exe\" \"test param\"");
    Test("\"C:\Program files\\test.exe");    // <<BAD
    Test("  \"C:\Program files\\test.exe"); // <<BAD
    Test("  \"C:\\Program\\test.exe\"");
    Test("");        // <<BAD (empty)
    Test("q");
    Test("\"");        // <<BAD
    Test("    \""); // <<BAD
    cout<<"---------------------------------"<<endl
        <<"End of test"<<endl;
    WaitForSingleObject(GetCurrentProcess(), -1);
    return 0;
}

Спасибо за помощь.
PM   Вверх
Oleg_Ci
Дата 6.8.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



А это для тебя нормально?
Код

int main(int, char**)    
{    
   char c[100];
   strcpy( c, "C:00Program files" );
   c[2] = c[3] = 92; // символ '\'

   Test( c );
   system("pause");
   return 0;    
}

Ответ - "С:\\Program"
Это я про два символа '\\' хотел сказать.

Это сообщение отредактировал(а) Олег4 - 6.8.2006, 10:06
PM MAIL   Вверх
586
Дата 6.8.2006, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата
Ответ - "С:\\Program" 


Разные вещи - "C:\\Program files" и "\"C:\\Program files\""
Если они будут в кавычках - это один параметр, если без - это 2 параметра.

Цитата
Код
strcpy( c, "C:00Program files" );
c[2] = c[3] = 92; // символ '\'

Не понял? Для чего?
PM   Вверх
Mayk
Дата 6.8.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(586 @  6.8.2006,  14:10 Найти цитируемый пост)

Разные вещи - "C:\\Program files" и "\"C:\\Program files\""

Винда кстати не считает путь C:\\\\ правильным. Для сравнения линуха путь //////////////usr////bin правильным считает.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.