我无法想出这个。我有一个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
但是,如果我使用发布版本,我什么都得不到:
我删除了发布输出文件夹,但问题完全相同。我只能假设发布和构建应用程序之间存在一些其他差异,这些应用程序暴露了我的代码的一个主要问题?或者我需要考虑的输出之间的另一个区别。
我需要做些什么来获得预期的输出?
答案 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。
此外,它在编译器和操作系统中更具可移植性。