所以我在C ++中为“算法导论”一书(CLRS)实现了最长公共子序列算法,它运行良好,有点。当我做这样的事情时:
./lcs abc bc > OUTPUT
当我打开OUTPUT
中的vim
文件时,我看到了这一点:
2 bc^@
哪个是正确的,没有那个奇怪的^@
符号。我做了一些谷歌搜索,这似乎是某种NULL
字符?
我以前从未遇到过这个问题..有谁知道怎么摆脱它?
谢谢! -kstruct
修改的 这是打印的代码:
cout << lcsLength << " ";
if (lcsLength > 0) cout << lcsString;
return 0;
lcsString
是std::string
的位置。不确定这是否有帮助...
答案 0 :(得分:4)
那是NUL
(这是一个字符值,并被定义为全比特为零),而不是NULL
(这是一个指针< / em>,几乎总是所有位为零,但不是必须的。)
我们需要确定看到你的代码,但最可能的原因是你打印了一个C字符串的另一个字节(它总是有NUL
作为它的最后一个字节)比你应该拥有的。
答案 1 :(得分: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
,使其最后包含一个空字符。