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;

}

例如,如果我\\serverName\Share\在调试中通过它的 UNC 路径调用我想要的服务器,它会给出我想要的东西:servername

但是,如果我使用发布版本,我什么也得不到:

输出不良

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

我需要做什么才能获得预期的输出?

4

1 回答 1

3

看起来您的调试版本设置为 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[])因为它适用于所有情况,尤其是使用字符的 std::string 。

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

于 2013-11-09T09:51:47.953 回答