如果第二个字符串在开头,strstr会返回与第一个字符串相同的指针吗?

时间:2016-05-04 01:25:42

标签: c string substring c-strings strstr

所以基本上,我需要找出一个字符串是以<link>开头还是以[URL]结尾。

现在我正在做:

[/URL]

根据cplusplus.com,“指向str2中指定的整个字符序列的str1中第一次出现的指针。”

这是否意味着我可以这样做?

const char *urlStart;
// ...
urlStart = strstr(message, "[URL]");
if (urlStart == NULL) {
    urlStart = strstr(message, "[url]");
}

if (urlStart == NULL) {
    return NULL;
}

初步测试似乎表明这不起作用。

完整的功能位于here

1 个答案:

答案 0 :(得分:3)

是的,假设Error Message: Exception in Application constructor Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class sample.Main at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(LauncherImpl.java:182) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:819) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) Caused by: java.lang.NullPointerException at sample.Main.<init>(Main.java:76) ... 10 more if (message != urlStart)message开头,检查[URL]将按预期工作。但是,如果[url]message开头,那么由于大小写不匹配,[Url]将找不到该字符串。

鉴于您要求字符串位于strstr中的已知位置,message函数对您没有太大作用。检查strstr的前5个字符比较简单,就像这样

message

你可以像这样检查char *start = "[URL]"; for ( int i = 0; i < 5; i++ ) if ( toupper(message[i]) != start[i] ) return NULL;

[/URL]

您也可以使用非大小写敏感长度限制的字符串比较,但请注意,这些不是可移植的。我相信它在Windows上为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; ,在unix克隆上为strnicmp