这是一个完整的工作示例:
#include <stdio.h>
#include <string.h>
int main(void) {
char string[] = "abcdefg";
char from[] = "c";
char to[] = "f";
char *first = strstr(string, from);
if (first == NULL) {
first = &string[0];
} else {
first += strlen(from);
}
char *last = strstr(first, to);
if (last == NULL) {
last = &string[strlen(string)];
}
char *sub = calloc(strlen(string) + 1, sizeof(char));
strncpy(sub, first, last - first);
printf("%s\n", sub);
free(sub);
return 0;
}
您可以通过this ideone查看。
现在,解释:
1.
char string[] = "abcdefg";
char from[] = "c";
char to[] = "f";
字符串的声明:要检查的主字符串,开始分隔符,结束分隔符。请注意,这些也是数组,因此 from 和 to 可以分别为 cd 和 fg。
2.
char *first = strstr(string, from);
在主字符串中查找开始分隔符的出现。请注意,它会找到 first 出现 - 如果您需要找到最后一个(例如,如果您有字符串 abcabc,并且您想要第二个 a 的子字符串),它可能需要不同。
3.
if (first == NULL) {
first = &string[0];
} else {
first += strlen(from);
}
处理字符串中第一个分隔符不出现的情况。在这种情况下,我们将从整个字符串的开头创建一个子字符串。但是,如果确实出现了,我们将指针移动from 字符串的长度,因为我们需要提取从第一个分隔符之后 开始的子字符串(感谢@dau_sama 的纠正)。
根据您的规格,这可能需要也可能不需要,或者可能会出现其他结果。
4.
char *last = strstr(first, to);
在主字符串中查找结束分隔符的出现。请注意,它会找到 first 的出现。
正如@dau_sama 所指出的,最好从first 搜索结束分隔符,而不是从整个字符串的开头。这可以防止出现to 早于from 的情况。
5.
if (last == NULL) {
last = &string[strlen(string)];
}
处理第二个分隔符没有出现在字符串中的情况。在这种情况下,我们将创建一个子字符串直到字符串结束,因此我们得到一个指向最后一个字符的指针。
同样,根据您的规格,这可能需要也可能不需要,或者可能会出现其他结果。
6.
char *sub = calloc(last - first + 1, sizeof(char));
strncpy(sub, first, last - first);
根据之前找到的指针分配足够的内存并提取子字符串。我们从first 字符开始复制last - first(子字符串的长度)字符。
7.
printf("%s\n", sub);
这是结果。
我希望它确实提供了足够详细的问题。根据您的具体规格,您可能需要以某种方式进行更改。例如,如果您需要查找 所有 个子字符串,而不仅仅是第一个,您可能需要创建一个循环来查找 first 和 last。