我在memcpy()
当我写这个
char ipA[15], ipB[15];
size_t b = 15;
memcpy(ipA,line+15,b);
它从第15个元素开始从数组b
复制line
个字节(很好,这就是我想要的)
memcpy(ipB,line+31,b);
从第31个元素开始的行复制b
个字节,但是它还附加了上一个命令的结果,即ipA
。
为什么呢? ipB
大小为15,因此它没有足够的空间来复制其他内容。什么事发生在这里?
ipA
的结果为192.168.123.123
ipB
的结果变为205.123.123.122 192.168.123.123
我哪里错了?我实际上并不知道C中的内存分配。
答案 0 :(得分:6)
看起来你并没有在ipA中终止字符串。编译器将两个变量放在内存中,因此字符串操作假定第一个空终止符是在第二个数组之后的某个时间(每当下一个0
出现在内存中时)。
尝试:
char ipA[16], ipB[16];
size_t b = 15;
memcpy(ipA,line+15,b);
ipA[15] = '\0';
memcpy(ipB,line+31,b);
ipB[15] = '\0';
printf("ipA: %s\nipB: %s\n", ipA, ipB)
这应该确认这是否是问题所在。显然你可以使代码比我上面的测试代码更优雅。作为手动终止的替代方法,您可以使用printf("%.*s\n", b, ipA);
或类似方法强制printf打印正确数量的字符。
答案 1 :(得分:2)
您是否通过printf("%s", ipA)
检查数组的内容?如果是这样,您将最终得到所描述的效果,因为您的数组被解释为一个非空终止的C字符串。请改为:printf("%.*s", sizeof(ipA), ipA)
答案 2 :(得分:0)
C中的字符串需要终止标记。它是char值0
。
由于你的两个字符串在内存中是连续的,如果你没有终止第一个字符串,那么当你读取它时,你将继续直到内存包含字符串结尾字符。