如果第二个字符串在开头,strstr return 是否与第一个字符串相同?
Will strstr return the same pointer as the first string if the second string is at the beginning?
所以基本上,我需要找出字符串是否以 [URL]
开头并以 [/URL]
结尾。
现在我在做:
const char *urlStart;
// ...
urlStart = strstr(message, "[URL]");
if (urlStart == NULL) {
urlStart = strstr(message, "[url]");
}
if (urlStart == NULL) {
return NULL;
}
根据cplusplus.com,"a pointer to the first occurrence in str1 of the entire sequence of characters specified in str2"。
这是否意味着我可以做到这一点?
/*
* If the pointer to message is the same as urlStart,
* message begins with urlStart
*/
if (message != urlStart) {
return NULL;
}
// URL starts 5 characters after [URL]
urlStart += 5;
初步测试似乎表明这不起作用。
完整的函数位于here.
是的,检查 if (message != urlStart)
将按预期工作,假设 message
以 [URL]
或 [url]
开头。但是,如果 message
以 [Url]
开头,则 strstr
将因为大小写不匹配而找不到字符串。
鉴于您需要字符串位于 message
中的已知位置,strstr
函数对您来说确实没什么用。只检查message
的前5个字符更简单,像这样
char *start = "[URL]";
for ( int i = 0; i < 5; i++ )
if ( toupper(message[i]) != start[i] )
return NULL;
你可以这样检查最后的[/URL]
length = strlen(message);
if ( length < 12 )
return NULL;
char *end = "[/URL]";
for ( int i = 0; i < 6; i++ )
if ( toupper(message[length-6+i]) != end[i] )
return NULL;
您也可以使用不区分大小写、长度受限的字符串比较,但请注意,它们不可移植。我相信它在 Windows 上是 strnicmp
,在 unix 克隆上是 strncasecmp
。
所以基本上,我需要找出字符串是否以 [URL]
开头并以 [/URL]
结尾。
现在我在做:
const char *urlStart;
// ...
urlStart = strstr(message, "[URL]");
if (urlStart == NULL) {
urlStart = strstr(message, "[url]");
}
if (urlStart == NULL) {
return NULL;
}
根据cplusplus.com,"a pointer to the first occurrence in str1 of the entire sequence of characters specified in str2"。
这是否意味着我可以做到这一点?
/*
* If the pointer to message is the same as urlStart,
* message begins with urlStart
*/
if (message != urlStart) {
return NULL;
}
// URL starts 5 characters after [URL]
urlStart += 5;
初步测试似乎表明这不起作用。
完整的函数位于here.
是的,检查 if (message != urlStart)
将按预期工作,假设 message
以 [URL]
或 [url]
开头。但是,如果 message
以 [Url]
开头,则 strstr
将因为大小写不匹配而找不到字符串。
鉴于您需要字符串位于 message
中的已知位置,strstr
函数对您来说确实没什么用。只检查message
的前5个字符更简单,像这样
char *start = "[URL]";
for ( int i = 0; i < 5; i++ )
if ( toupper(message[i]) != start[i] )
return NULL;
你可以这样检查最后的[/URL]
length = strlen(message);
if ( length < 12 )
return NULL;
char *end = "[/URL]";
for ( int i = 0; i < 6; i++ )
if ( toupper(message[length-6+i]) != end[i] )
return NULL;
您也可以使用不区分大小写、长度受限的字符串比较,但请注意,它们不可移植。我相信它在 Windows 上是 strnicmp
,在 unix 克隆上是 strncasecmp
。