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

时间:2009-04-28 05:16:27

标签: 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);
}

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

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);
}

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

▀ÇΦy♠≈6♦

可能会发生什么?

更新:

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

仍然打印

▀ÇΦy♠≈6 ♦

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

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

有什么想法吗?

感谢大家的帮助

由于

11 个答案:

答案 0 :(得分:7)

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

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

如果可行,那么还有其他错误,您需要一次添加一行直到失败。然后仔细检查那行非常(“我正在寻找wabbits”)。

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

int main() {  
    std::string a = "test";
    std::cout << a << std::endl;
    return 0;
}

<强>更新

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

  • 确保您使用标准C ++运行时链接。
  • 确保您没有#define string作为其他内容(并且编译器包含-Dstring=somethingelse命令行选项。)
  • 使用std::string检查行为,而不只是string

答案 1 :(得分:2)

也试试这个:

int main()
    {  
        //simple string creation
        string a = "test";
        const char* cStr = a.c_str();
        //should print out "test"
        cout << cStr << endl;
        return(DSL_OKAY);
    }

如果const char*行不会导致编译器错误,那么我们知道std::str是一个8位字符串。如果cout不会导致编译器错误,那么我们知道{8}为8位字符定义了cout。 (如果程序产生相同的结果,那么我们仍然感到困惑: - }

编辑(根据您在下面的评论):我注意到“test”的错误输出可以解决9个字符 - “▀ÇΦy♠≈6♦”。尝试其他“测试”字符串,例如哦,“重新测试”或“foo”。我怀疑你的输出通常是原始字符串中字符数的2x或2x + 1(“重新测试”为12或13,“foo”为6或7)。这表明你正在输入16位字符串进入一个8位缓冲区。我不知道你怎么能通过编译器得到它 - 也许你对std :: string和/或cout有一个错误或过时的定义?

编辑2 :我记得我之前见过的地方。几年前,我看到DOS控制台窗口破坏程序输出的问题。 (我不记得确切的细节,但我认为问题是DOS控制台无法处理UTF-8字符集。)如果你在DOS窗口中看到这个输出(或者,如果它是通过system()传送到另一个程序),然后尝试将其重定向到一个文件,然后用记事本打开该文件。它可能会起作用......

答案 2 :(得分:1)

检查是否

  • 您是否包含#include<iostream>和其他相关标题?
  • net.GetNumberOfSamples()的有效值为AND
  • 您没有混合stringwstring

答案 3 :(得分:1)

您是100%源代码文件是ASCII吗?尝试在某个十六进制编辑器中打开它。

尝试在全新的文件中键入(不复制/粘贴)代码,看看会发生什么。

如果失败了,那么你的cout显然会有些东西。你能告诉我们哪些库被链接到可执行文件中吗?也许某些东西会关闭stdout流或类似的东西。

答案 4 :(得分:0)

我建议慢慢删除任何#includes,直到找到导致问题的那个。

答案 5 :(得分:0)

您可以尝试为字符串类型显式指定std命名空间。

我建议你尝试这个的主要原因是在一些包含的头文件中可能有一个定义用一些其他类或定义替换字符串。添加命名空间应该强制不使用宏。

要检查的另一件事是获取一个已处理的列表(或者如果你想做一些装配黑客攻击的汇编和源代码清单)写入文件的源代码并检查它是什么如果没别的话,你可能会在那里找到答案。

答案 6 :(得分:0)

编译并运行以下确切代码;不要添加任何using指令。

#include <iostream>
#include <string>

int main() {
    std::string s = "test";
    for ( unsigned int i = 0; i < s.size(); i++ ) {
        std::cout << s[i];
    }
    std::cout << "\n";
    std::operator<<( std::cout, s );
    std::cout << "\n";
}

如果循环打印“test”,则表示字符串正常,问题出在输出中。如果第二个“测试”被破坏,问题肯定在输出处理中。

答案 7 :(得分:0)

将std :: string转换为char字符串是否有效。 即:

cout << a << endl;

变为

cout << a.c_str() << endl;

答案 8 :(得分:0)

你很可能正在混合使用wchar和char,因此在你的main中,固定的字符被认为是宽的(2字节/字符)或者是一些unicode,而你的cout的lib认为它们是简单的1字节/字符。我会查看与项目链接的库。

不幸的是,我不确定如何解决这个问题。几乎可以肯定你的项目可以改变一个设置(不幸的是我没有VS 2005),但是你正在寻找像wchar,t_char或unicode这样的东西。

如果您使用

,我会很好奇
string a("test");

而不是直接分配。

答案 9 :(得分:0)

是否有可能在同一项目中的另一个文件operator <<中的某个位置超载? 请尝试搜索“operator <<”或“operator<<”。

答案 10 :(得分:0)

建议:

  • cout.flush之前致电cout <<,看看你是否得到了奇怪的字符
  • 尝试printf