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[])ます。

_tmain のパラメーターとして型を使用charすると、Unicode ビルドの使用時にコンパイラが間違った型を使用するようになり、'\0'std::string が処理できない最初のバイトとして文字が使用されます。

あなたの場合int main(int argc, char *argv[])、特に文字を使用する std::string では、すべての場合で機能するため、固執することをお勧めします。

また、コンパイラやオペレーティング システム間で移植性が向上します。

于 2013-11-09T09:51:47.953 に答える