c 语言 编写子串查找函数 int find_ str(const char* strl, const char* str2),返回str2在str1中的位置。如果str2在str1中不存在,那么返回-1。如果str2在str1中出现多次,那么以第1 次出现为准。使用指针进行编写。
时间: 2024-02-28 17:56:23 浏览: 64
好的,这是一个简单的实现:
```c
int find_str(const char* str1, const char* str2) {
const char* p1 = str1;
const char* p2 = str2;
const char* p3 = NULL;
while (*p1 != '\0' && *p2 != '\0') {
if (*p1 == *p2) {
if (p3 == NULL) {
p3 = p1;
}
p2++;
} else {
p2 = str2;
p3 = NULL;
}
p1++;
}
return (p2 == '\0') ? (p3 - str1) : -1;
}
```
这里使用了三个指针,p1指向str1,p2指向str2,p3指向str2在str1中第一次出现的位置。然后使用while循环逐个字符比较,如果匹配成功,则p2指针后移,如果p3为空,则将p3指向当前位置。如果匹配失败,则将p2和p3重置,并将p1指针后移。最后判断p2是否到达str2的末尾,如果是,则返回p3在str1中的偏移量,否则返回-1。
相关问题
c 语言 编写子串查找函数 int find_str(const char*strl,const char*str2),返回str2在strl中的位置。如果str2在str1中不存在,那么返回-1。如果str2在str1中出现多次,那么以第1改出现为准。使用指针进行编写。
可以使用指针来编写一个子串查找函数,函数的实现如下所示:
```c
int find_str(const char* strl, const char* str2) {
const char* p1 = strl;
const char* p2 = str2;
int pos = -1;
while (*p1 != '\0') {
if (*p1 == *p2) {
if (pos == -1) {
pos = p1 - strl;
}
p2++;
if (*p2 == '\0') {
return pos;
}
} else {
p2 = str2;
if (pos != -1) {
p1 = strl + pos;
}
pos = -1;
}
p1++;
}
return -1;
}
```
该函数接收两个参数,分别是要查找的字符串 `strl` 和子串 `str2`。使用两个指针 `p1` 和 `p2` 分别指向 `strl` 和 `str2` 的首字符。使用变量 `pos` 来记录子串在主串中的位置。如果子串在主串中不存在,则 `pos` 的值为 `-1`。
在 while 循环中,首先判断 `p1` 和 `p2` 指向的字符是否相等。如果相等,则将 `p2` 向后移动一位,并检查其是否遍历完了子串 `str2`。如果遍历完了,则直接返回 `pos` 的值,即子串在主串中的位置。
如果 `p1` 和 `p2` 指向的字符不相等,则需要重新开始查找。将 `p2` 指回 `str2` 的首字符,并将 `pos` 的值设为 `-1`。如果之前已经找到了一部分子串,则将 `p1` 指向之前找到的位置,并重新开始查找。
最后,如果整个主串都遍历完了,仍然没有找到子串,则返回 `-1`。
注意,本函数是区分大小写的。如果需要忽略大小写,可以使用库函数 `strcasecmp` 来进行比较。
编写子串查找函数int find_ str(const char* str1, const char* str2),返回str2在str1中的位置。如果str2 在str1中不存在,那么返回-1。如果str2在str1中出现多次,那么以第1改出现为准。使用指针进行编写。
以下是使用指针实现的子串查找函数代码:
```c
int find_str(const char* str1, const char* str2) {
if (str1 == NULL || str2 == NULL)
return -1;
int len1 = strlen(str1);
int len2 = strlen(str2);
if (len2 > len1)
return -1;
for (int i = 0; i < len1 - len2 + 1; i++) {
const char* p = str1 + i;
const char* q = str2;
while (*q != '\0' && *p == *q) {
p++;
q++;
}
if (*q == '\0')
return i;
}
return -1;
}
```
首先,我们对输入的参数进行了非空判断。如果str1或str2为空,则直接返回-1。
然后,我们获取了str1和str2的长度,并且判断了一下str2是否比str1长。如果是,说明str2不可能是str1的子串,直接返回-1。
接着,我们循环遍历str1中所有可能的子串,从第一个字符开始逐个比较。在每个位置上,我们都定义了两个指针p和q,分别指向当前位置和str2的开头。然后,我们逐个比较p和q所指向的字符,如果相等就继续比较,如果不相等就退出循环。如果q所指向的字符为'\0',说明str2已经全部匹配成功,直接返回当前位置i。
如果循环结束后还没有返回值,说明str2在str1中不存在,直接返回-1。
需要注意的是,在这个函数中,我们并没有修改str1和str2所指向的字符串。这是因为它们都是const char*类型的指针,不能修改它们所指向的内容。
阅读全文