使用 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 时发送额外的垃圾字节 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章