Гибкая обработка строк в Visual Studio 2008 C ++ - PullRequest
1 голос
/ 17 мая 2010

Я постепенно начинаю понимать, что такое _T в Visual Studio 2008 c ++, но некоторые вещи все еще ускользают от меня. Я вижу выгоду гибкости, но если я не смогу быстро освоить основы, я думаю, что вернусь к стандартному способу сделать это - гораздо менее запутанным.

Идея с кодом ниже состоит в том, что он сканирует параметры для -d и затем сохраняет текст, следующий за этим, в строковой переменной fileDir. Он также игнорирует любые другие параметры.

Любая помощь приветствуется.

//Console application
Parameters::Parameters(int argc, _TCHAR* argv[]) 
{ 
    _Tstring fileDir;  // Is there some kind of _t variable to use here for a string?

    for (int i = 0; i < argc; i = i + 1)
    {           
        if (_tccmp(argv[i], _T("-d")) == 0)  // this appeared to accept anything starting with -
        {           
            i = i + 1;
            fileDir = argv[i]
        }
    }   

    _tprintf("Parameter value found: %s\n", fileDir);
} 

Ответы [ 2 ]

1 голос
/ 17 мая 2010

Вы можете использовать _tstring для представления и std::string с параметром TCHAR. Кроме того, имя функции - _tcscmp, а не _tccmp, поэтому я не вижу, как этот фрагмент кода мог даже компилироваться?

Если честно, я бы не стал беспокоиться ни об этом. Весь материал TCHAR был полезен, когда люди писали код, который должен был быть переносимым между Windows 9X (которая была внутри Ansi) и Windows NT (которая была / есть внутри Unicode). В наши дни очень мало пользы от использования макросов.

Если вы хотите что-то сделать, вы можете полностью переключиться на wchar_t. Это означает префикс строковых литералов с «L», как в L"Some wide-char string" и использование версий функций «w» (например, std::wstring, wcscmp и т. Д.). Но даже это может считаться излишним для многих сценариев.

0 голосов
/ 17 мая 2010

Если вы хотите скопировать строковое значение и используете MFC или ATL, ваша _Tstring может быть CString.

Если вы хотите скопировать значение указателя, вашей _Tstring может быть LPTCSTR. (Это работает независимо от того, используете ли вы MFC или ATL.)

Как сказала кодека, ваш _tccmp должен быть _tcscmp. Альтернативой, если вы используете MFC или ATL, является метод сравнения CString.

Вы не показали, как вызывающая сторона передает параметр argv вашему конструктору. Если argv пришел из вашей функции _tmain, убедитесь, что параметры _tmain верны.

...