release和Debug之间的输出不同

时间:2013-11-08 16:35:42

标签: c++

我无法想出这个。我有一个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

我删除了发布输出文件夹,但问题完全相同。我只能假设发布和构建应用程序之间存在一些其他差异,这些应用程序暴露了我的代码的一个主要问题?或者我需要考虑的输出之间的另一个区别。

我需要做些什么来获得预期的输出?

1 个答案:

答案 0 :(得分: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 :: string无法处理。

在你的情况下,我建议坚持int main(int argc, char *argv[]),因为它适用于所有情况,特别是使用chars的std :: string。

此外,它在编译器和操作系统中更具可移植性。