1

因此,我在 C++ 中为算法介绍书 (CLRS) 实现了最长公共子序列算法,它工作得很好,有点。当我做这样的事情时:

./lcs abc bc > OUTPUT

当我在 中打开OUTPUT文件时vim,我看到:

2 bc^@

这是正确的,没有那个奇怪的^@符号。我做了一些谷歌搜索,这似乎是某种NULL角色?

我以前从未遇到过这个问题..有人知道如何摆脱它吗?

谢谢!-kstruct

编辑 这是执行打印的代码:

cout << lcsLength << " ";
    if (lcsLength > 0) cout << lcsString;

return 0;

lcsString一个在哪里std::string。不确定这是否有帮助...

4

2 回答 2

4

那是NUL(这是一个字符值,并且被定义为全位为零),而不是NULL(这是一个指针,几乎总是全位为零,但不是必须的)。

我们需要查看您的代码才能确定,但​​最可能的原因是您打印的 C 字符串的一个字节(它始终NUL作为最后一个字节)比您应该打印的多一个字节。

于 2012-05-23T04:16:00.863 回答
4

您已经展示了输出 lcsString 的代码,但与 C 样式字符串不同,std::string类型可以包含空字符,因为长度与字符串数据本身分开维护。

尝试添加以下内容以转储字符串的内容:

cout << "length of lcsString: " << lcsString.length() << endl;
cout << '"' << lcsString << '"' << endl;
for (int i = 0; i < lcsString.length(); ++i) {
    cout << hex <<  int(lcsString[i]) << " ";
}
cout << endl;

我打赌你会看到:

length of lcsString: 3
"bc "
62 63 0 

然后你需要找出你正在做什么来创建(或修改)lcsString它在最后包含一个空字符。

于 2012-05-23T04:47:04.807 回答