使用 strlen 时如何不为空终止符添加 +1 会导致使用 send 时发送额外的垃圾字节 [关闭]

Posted

技术标签:

【中文标题】使用 strlen 时如何不为空终止符添加 +1 会导致使用 send 时发送额外的垃圾字节 [关闭]【英文标题】:how does not adding +1 for the null terminator when using strlen cause extra junk bytes to be sent when using send [closed] 【发布时间】:2012-12-23 23:16:41 【问题描述】:

我试图弄清楚为什么当我手动键入一个字符串长度(如 (int)18 并给它输入的 18 长度字符串的相同数据时,它与 (int)strlen(variable[1]) 不同) strlen 在变量 [1] 上计算时产生 18。我希望由于 strlen 函数的结果为 18,因此两者会产生相同的结果,但由于某种原因,strlen 会丢弃诸如 ョœ 或其他随机字符之类的垃圾数据。为了解决这个问题 (int)strlen(variable[1])+1 有效,但我仍然不明白当这两个函数导致 int 值 18 时它们会产生不同的结果。

编辑:尝试简化我的问题,如何

iResult = send( ConnectSocket, argv[2], (int)strlen(argv[2]), 0 );

不同于

iResult = send( ConnectSocket, argv[2], (int)5, 0 );

什么时候 argv[2] 是“12345”?我希望得到相同的结果,但我错了,我想知道如何/为什么。

EDIT2:没关系,我一定做了一些愚蠢的事情,比如在没有意外重新编译的情况下测试程序,因为现在一切都按照我期望的方式工作......

【问题讨论】:

你的帖子太模糊了,甚至无法编辑。尝试重写它,并尝试使您的标题更简洁。 一些 code 将是一个 stellar 地方开始剥离这个问题的层次。 我有点明白,但还不足以回答...... 第一个是将字符发送到 argv[2] 指向的字符串中,但不包括空终止符。第二个是盲目地发送恰好 5 个字符,从地址 argv[2] 开始,不检查或保证引用(读取)的数据甚至 可访问 很可能,您只是在使用损坏的代码来接收,而行为的差异来自于代码被损坏。 (很可能,接收代码将任意字节串视为必须是 C 风格的字符串。接收代码也可能假定 TCP 将字节“粘合”到消息中。) 【参考方案1】:

如果字符串末尾没有零,任何寻找零的东西都会继续。 strlen() 和其他函数知道字符串结束的唯一方法是因为末尾有一个零。因此,例如,如果您使用 printf("%s", somestring); 并且 somestring 没有终止零, printf 将继续打印字符串之后发生的任何内容 - 可能是“不可打印”和“外来”字符.

【讨论】:

您,先生,具有非凡的理解能力。 :) 不,我以前多次看到过这类问题——措辞不完全相同,但大意是这样的。 实际上它没有回答我的问题 :( 谢谢你的回答。我将不得不更准确地重新表述我的问题,可能在另一个问题中,因为我认为这个问题会得到在我准备这样做的时候关闭。 如果你已经解决了这个问题,你能用你自己的答案将它标记为“已回答”吗? [如“确保你已经在编辑器中编译了实际代码”] 嗨,Mats,既然您能够回答这个问题,也许您可​​以给提问者一些有用的建设性建议,让他/她可以编辑问题以使其更清晰并扭转一些否决票。我相信提问者会很感激您提供的任何有用的指导。您还可以对问题进行建议的编辑以提供帮助。 :) 如果有兴趣,请查看此元帖子:meta.stackexchange.com/questions/160455/…

以上是关于使用 strlen 时如何不为空终止符添加 +1 会导致使用 send 时发送额外的垃圾字节 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何判断Object对象不为空

如何使用火花流检查 rdd 是不是为空?

用户键入时如何保持输入占位符可见

如何在 oracle 中使可空列不为空

如何终止 QThread

没有返回行时如何在 Ag Grid 中添加占位符?