奇怪的C++ std :: string行为......我该如何解决这个问题?

Eri*_*ede 1 c++ string

这让我疯了.我已经花了两个多小时试图解决这个问题......

这是我的问题.我正在开发一个适用于贝叶斯网络的大型程序.这是主要功能:

using namespace std;

int main()
{  
    DSL_network net;
    initializeNetwork(net); 
    setEvidence(net);
    net.SetDefaultBNAlgorithm(7);
    net.SetNumberOfSamples(80000);
    cout << "Samples:\t" << net.GetNumberOfSamples() << endl;
    updateEvidence(net);
    //net.WriteFile("test.dsl");
    return(DSL_OKAY);
}
Run Code Online (Sandbox Code Playgroud)

一切正常.当我想要打印出一个字符串时出现问题:

using namespace std;

int main()
{  
    //simple string creation
    string a = "test";
    //should print out "test"
    cout << a << endl;
    DSL_network net;
    initializeNetwork(net); 
    setEvidence(net);
    net.SetDefaultBNAlgorithm(7);
    net.SetNumberOfSamples(80000);
    cout << "Samples:\t" << net.GetNumberOfSamples() << endl;
    updateEvidence(net);
    //net.WriteFile("test.dsl");
    return(DSL_OKAY);
}
Run Code Online (Sandbox Code Playgroud)

这是输出(只是打印字符串a ...):

   ▀ÇΦy♠≈6♦

会发生什么事?

更新:

int main()
    {  
        //simple string creation
        string a = "test";
        //should print out "test"
        cout << a << endl;
        return(DSL_OKAY);
    }
Run Code Online (Sandbox Code Playgroud)

仍然打印

?Ç?y??6 ?
Run Code Online (Sandbox Code Playgroud)

大新闻: 这是最近的.我创建了一个全新的项目并粘贴了Neil Butterworth发布的代码(感谢顺便说一下).我运行代码并正确打印.然后我将两个.lib文件添加到新项目中的链接器(用于SMILE库的smile.lib,以及用于套接字的wsock32.lib).

我再次尝试了代码,它正确地打印了第一个"测试",然后打印了giberish.这是我链接在一起的.lib之一的问题.我自己试了一下,看看它们是否只是冲突,而且似乎是smile.lib库导致了问题.我需要进入他们的文档并弄清楚原因.

有任何想法吗?

谢谢大家的帮助

谢谢

pax*_*blo 7

这很奇怪.我总是喜欢把问题解决到最小的情况.运行它时,以下程序会执行什么操作?

using namespace std;
int main() {  
    string a = "test";
    cout << a << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果这样可行,那么还有其他错误,您需要一次添加一行直到失败.然后检查线非常谨慎("我在捉wabbits").

根据您的编辑,它可能是使用的不同字符串类.试试这个:

int main() {  
    std::string a = "test";
    std::cout << a << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

更新:

由于它适用于新项目而不是当前项目,请检查以下内容.

  • 确保您使用标准C++运行时链接.
  • 确保你没有#define string作为其他东西(并且包括-Dstring=somethingelse编译器的命令行选项).
  • 使用std::string而不仅仅是检查行为string.