2009-12-06 96 views
0

我有点卡在这里。我正在为Commerce Server 2009开发一个自定义Pipleline组件,但这与我的问题没有多大关系。在C中读取时,如何从C++中获得 0的字符串#

在管道的设置中,我给用户一个窗体窗体来输入一些配置值。其中一个值是SharePoint网站的URL。 Commerce Server使用所有这些流水线内容的C++组件,因此输入的值将被放入IDictionary中,并最终通过Microsoft的C++组件持久保存到数据库中。

当我在流水线执行过程中读取字符串时,它会从C++的IDictionary对象中传递给我。我的C#代码看到后缀为\ 0 \ 0的URL。我不确定这些来自哪里,但是我的代码因为它不是一个有效的URI而被炸毁。在我保存并修剪它时,我正在修剪该字符串,并且仍然无法删除这些字符。

任何想法是什么造成了这一点,我怎么能摆脱它?我更喜欢不要像子字符串那样进行破解,而是根本原因。

感谢, 科瑞

+2

的\ 0来自在C/C++字符串终止与约定\ 0(又名空)。它们被称为“以空字符结尾的字符串” – 2009-12-06 17:03:53

+0

您的c#代码是否定义了封送处理?你正在得到一个IDictionary,所以有问题的字符串正在从一个对象转换?可能会将元素换行或以其他方式将对象转换为适当的字符串。你可以发布一些有问题的代码吗? – ongle 2009-12-06 19:04:00

回答

4

这会帮助:

string sFixedUrl = "hello\0\0".Trim('\0'); 
+2

我认为这将解决它,但它就像Substring一样的黑客。它没有解决问题的原因。 – 2009-12-06 17:07:23

+0

我认为根本原因必须是在我的控制之外的方程MS方面,正如ltcmelo所暗示的。我将使用Trim解决方案,不管是否破解,因为它的工作原理和我通过我写的“NullSafeString”对象读取所有字符串,所以这足够好,并且像冠军一样工作。 – 2009-12-06 19:01:16

0

this网站:

C中的一个字符串是简单的字符数组,最后一个字符设置为NUL字符(ascii/unicode point 0)。该空终止符是必需的;如果字符串不在那里,则字符串不合格。 C/C++(“string”)中的字符串文字标记保证了这一点。

const char *str = "foo"; 

相同

const char *str = {'f', 'o', 'o', 0}; 

所以只要C++组件获得您的IDictionary,它将空值终止字符串添加到年底。如果你想删除它,你必须在返回字典之前从结尾中删除空终止的字符。请参阅this文章,了解如何删除空字符。基本上你需要知道确切的大小和修剪它。

1

正如其他人的帖子所解释的,C中的字符串以空字符结尾。 (注意,C++已经提供了一个不依赖于字符串类型的字符串类型。)

你的情况有点不同,因为你得到的是双空字符结尾的字符串。我不是这里的专家,所以如果我错了,任何人都应该随时纠正我。但是这看起来像是Windows中使用宽字符的unicode/i18n aware应用程序的典型字符串表示。请看看this

一个猜测是,将字符串保存到数据库中的应用程序没有使用“便携”策略。例如,它可能会持续考虑其字符串缓冲区的大小,原因是原始字节为,而不是其实际的长度为。前者会在最后计算额外的两个零(因此也会坚持),而后者会丢弃它们。

0

另一种可以使用的技术是字符数组和数组长度。一个字符数组不需要终止空字符。

当你通过这种数据结构,还必须通过的长度。 C风格字符串的约定是通过搜索'\ 0'(或Unicode,'\ 0 \ 0')来确定字符串的结尾。由于该数组没有终止字符,因此总是需要长度。

更好的解决方案是使用std::string。它不会追加空字符。当您需要兼容性或C风格格式时,请使用c_str()方法。我必须在我的程序中使用这种技术,因为GUI框架具有与std::string不兼容的自己的字符串数据类型。

相关问题