我想在更大的字符串中搜索字符串的一部分后找到它的长度。
我不能使用 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 返回负值(即使是正值也是错误的)
如果您的数据不是以 NULL 结尾的,那么您不能调用 strstr(),原因与不能调用 strlen() 的原因相同。如果这样做,您最终可能会扫描到数据的末尾。如果你在那里找到匹配项(这很有可能;读到数组末尾并不能保证程序崩溃),那么你的指针算法会给你一个负值,因为你从一个更大的地址中减去一个较小的一个。
另一方面,如果您的数据实际上正确地以 NULL 结尾,那么您的问题可能是 strstr() 没有找到子字符串并因此返回 NULL。你在检查NULL吗?否则,你最终要做的是:
len1 = temp + len - (char*)NULL;
最终答案:
你正在寻找len - (temp1 - temp)
. 第一部分的长度是temp1 - temp
。从整个字符串的长度中减去它,得到剩余部分的长度。
更长的答案:
因为strlen
(这是您在示例中使用的,即使它仅适用于正确的文本消息)直到找到一个\0
字符,您可以简单地使用strlen(temp1)
输入的最后一部分的长度。如果您真的担心调用strlen
两次会损害您的性能(真的吗?)那么您可以使用len - (temp1 - temp)
.
如果您对输入的第一部分的长度感兴趣,则只需要进行指针减法。
如果你想使用包含\0
在非终端位置的二进制数组,你根本不能strlen
在你的代码中使用。但是,您必须有一种方法来指定整个输入的长度。要么你有一个整数变量,要么你有一个特定的分隔符和一个长度计算函数。
如果你有长度的整数变量,那么由于输入的第一部分的长度是通过指针减法获得的,你只需要做len - (temp1 - temp)
.
如果您有一个长度计算函数,只需将其temp1
作为参数调用即可。
PS:不要忘记检查是否返回 NULL(顺便说一下,如果缓冲区内有二进制数据,strstr
则不能使用)strstr
\0