0

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

我不能使用 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 返回负值(即使是正值也是错误的)

4

2 回答 2

2

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

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

len1 = temp + len - (char*)NULL;
于 2013-06-21T08:13:57.273 回答
1

最终答案

你正在寻找len - (temp1 - temp). 第一部分的长度是temp1 - temp。从整个字符串的长度中减去它,得到剩余部分的长度。

更长的答案

因为strlen(这是您在示例中使用的,即使它仅适用于正确的文本消息)直到找到一个\0字符,您可以简单地使用strlen(temp1)输入的最后一部分的长度。如果您真的担心调用strlen两次会损害您的性能(真的吗?)那么您可以使用len - (temp1 - temp).

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

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

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

如果您有一个长度计算函数,只需将其temp1作为参数调用即可。

PS:不要忘记检查是否返回 NULL(顺便说一下,如果缓冲区内有二进制数据,strstr则不能使用)strstr\0

于 2013-06-21T08:11:40.513 回答