2013-11-08 3 views
1

Я не могу понять это. У меня есть приложение C++, который работает в режиме отладки точно так, как ожидается:Разный выход между выпуском и отладки

#include "stdafx.h" 
#include <string> 
#include <Windows.h> 
#include <iostream> 

using namespace std; 

void truncateServer(std::string inString); 
int _tmain(int argc, char *argv[]) 
{ 
    char* server = argv[1]; 

    truncateServer(server); 
} 

void truncateServer(std::string inString) 
{ 
    std::string server = ""; 
    int whackCount = 0; 

    for (unsigned int i = 0; i < inString.length(); i++) 
    { 
     char c = inString[i]; 

     if (whackCount < 3) 
     { 
      if (c == '\\') whackCount++; 
      else 
      server += c; 
     } 

    } 

    cout << server; 

} 

Например, если я позвоню сервер я хочу через его UNC-путь \\serverName\Share\ в отладить это дает мне именно то, что я хочу: servername

Однако, если я использую сборки выпуска я ничего не получаю:

Bad Output

Я удалил папку вывода релиза, но этот вопрос точно так же. Я могу только предположить, есть ли другая разница между приложениями выпуска и сборки, которые подвергли серьезную проблему с моим кодом? Или другое различие между выводами, которые мне нужно учитывать.

Что мне нужно сделать, чтобы получить ожидаемый результат?

+0

Хмм, это ваш отладочный сборник ANSI и ваш выпускной сборник UNICODE? Кроме того, правильное объявление: 'int _tmain (int argc, TCHAR * argv [])', потому что в строках Unicode используются широкие символы. – SirDarius

+0

Можете ли вы добавить запись в сборку выпуска, чтобы показать, получаете ли вы ожидаемые значения в разных точках? – user1118321

+0

Не используйте '_tmain'. По причинам @SirDarius говорится: вы не знаете, чем это закончится. –

ответ

3

Похоже, что ваша сборка Debug установлена ​​как Ansi, а ваша релиз - как Unicode.

Объявление _tmain - это макрос Visual Studio, который изменяет точку входа вашего приложения в зависимости от используемой кодировки.

Для ANSI он соответствует int main(int argc, char *argv[]).
Для Unicode он соответствует int wmain(int argc, wchar_t *argv[]).

С помощью char типа в качестве параметра _tmain, вы заставляете компилятор использовать неправильный тип при использовании сборки Unicode, и поэтому в конечном итоге с '\0' символа в качестве первого байта, который STD :: строка не может обрабатывать ,

В вашем случае я рекомендую придерживаться int main(int argc, char *argv[]), так как он будет работать во всех случаях, особенно с std :: string, которые используют символы.

Кроме того, оно более переносимо для компиляторов и операционных систем.

Смежные вопросы