从指针中减去获取长度

时间:2013-06-21 07:55:39

标签: c pointers

我希望在更大的字符串中搜索字符串的一部分之后找到它的长度。

我处理二进制数据时无法使用strlen。

char *temp= "this is some random text";
char *temp1 = strstr(temp,"some");
int len = strlen(temp);
int len1 =0;

len1 = temp+len - temp1; 

获取“一些随机文本”的长度

len1返回负值(即使它的正值是错误的)

2 个答案:

答案 0 :(得分:2)

如果您的数据不是以NULL结尾的,那么就不能调用strstr(),原因与您无法调用strlen()相同。如果这样做,您最终可能会扫描数据的末尾。如果你在那里找到一个匹配(这很可能;读取超过数组的结尾并不能保证程序崩溃),那么你的指针算术 会给你一个负值,因为你'从较小的地址中减去较大的地址。

另一方面,如果您的数据实际上是以NULL结尾的,那么您的问题可能是strstr()找不到子字符串,因此返回NULL。你在检查NULL吗?否则,你最终做的是:

len1 = temp + len - (char*)NULL;

答案 1 :(得分:1)

最终答案

您正在寻找len - (temp1 - temp)。第一部分的长度为temp1 - temp。从整个字符串的长度中减去它以获得剩余部分的长度。

更长的答案

由于strlen(这是您在示例中使用的内容,即使它仅适用于正确的短信),直到找到\0字符为止,您只需使用strlen(temp1)对于输入的最后部分的长度。如果您真的担心两次致电strlen会损害您的表现(真的吗?)那么您可以使用len - (temp1 - temp)

如果你对输入的第一部分的长度感兴趣,你只需要做指针减法。

如果您想在非终端位置使用包含\0的二进制数组,则根本无法在代码中使用strlen。但是,您必须有一种方法来指定整个输入的长度。要么在整数变量中有这个,要么你有一个特定的分隔符和一个长度计算函数。

如果你有长度的整数变量,那么,由于输入的第一部分的长度是通过指针减法获得的,你只需要做len - (temp1 - temp)

如果你有长度计算功能,只需用temp1作为参数调用它。

PS :不要忘记检查strstr是否返回NULL(顺便说一句,如果您的二进制数据为{{1},则无法使用strstr在缓冲区内)