使用strlen时如何不为null终止符添加+1,导致在使用send时发送额外的垃圾字节

时间:2012-12-23 23:16:42

标签: c++ c string

我试图找出为什么当我手动输入一个字符串长度,如(int)18并给它相同的18长度字符串数据输入不同于(int)strlen(变量[1])时strlen在变量[1]上计算得到18.我期望由于strlen函数的结果为18,两者会产生相同的结果,但由于某种原因,strlen会抛出垃圾数据,如ョ或其他随机字符。为了解决这个(int)strlen(变量[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:没关系我一定做过蠢事就像测试程序而不重新编译意外,因为现在一切都按照我期望的方式运行......

1 个答案:

答案 0 :(得分:5)

如果你在一个字符串的末尾没有零,那么任何寻找零的东西都会继续。 strlen()和其他函数知道字符串结束的唯一方法是因为最后有一个零。因此,例如,如果您使用printf("%s", somestring);并且somestring没有终止零,则printf将继续运行,打印在字符串后面发生的任何事情 - 这可能是“不可打印的”, “外国”人物。