string.h库中strstr()函数如何知道查找的子串在被查找的字符串中不存在
时间: 2024-03-18 17:42:04 浏览: 84
`strstr()`函数会返回一个指向被查找字符串中第一次出现查找子串的指针。如果被查找字符串中不存在查找子串,则该函数将返回`NULL`指针。
这是因为`strstr()`函数内部实现中,会在被查找字符串中逐个字符地查找是否包含查找子串。如果遍历整个被查找字符串后仍然没有找到查找子串,那么就会返回`NULL`指针,表示查找失败。
因此,在使用`strstr()`函数时,我们应该判断返回值是否为`NULL`,以确定是否找到了要查找的子串。例如:
```C
char str1[] = "Hello, world!";
char str2[] = "world";
char *ptr = strstr(str1, str2);
if (ptr != NULL) {
printf("'%s' was found in '%s' at position %ld.\n", str2, str1, ptr - str1);
} else {
printf("'%s' was not found in '%s'.\n", str2, str1);
}
```
如果`str2`被包含在`str1`中,则会输出`'world' was found in 'Hello, world!' at position 7.`否则会输出`'world' was not found in 'Hello, world!'.`
相关问题
用c++按照要求实现串的基本操作并说明步骤,程序界面如下所示:1.求字符串的长度 2.从主串中取一个子串 3.比较两个字符串的大小 4.比较一个子串在主串中的位置 5.将两个子串连接成一个新的字符串 0.退出系统
好的,我将按照您的要求回答这个问题。首先,我们需要定义一个字符串类,它包含了字符串的基本操作。下面是一个示例实现:
```cpp
#include<iostream>
#include<string.h>
using namespace std;
class String
{
private:
char* str; // 用char数组保存字符串
int len; // 记录字符串的长度
public:
String(const char* s = "") // 构造函数
{
len = strlen(s);
str = new char[len + 1]; // 分配内存
strcpy(str, s);
}
~String() // 析构函数
{
delete[] str; // 释放内存
}
int length() // 求字符串的长度
{
return len;
}
String substr(int pos, int n) // 取一个子串
{
char* s = new char[n + 1];
strncpy(s, str + pos, n);
s[n] = '\0';
String sub(s);
delete[] s;
return sub;
}
int compare(String& s) // 比较两个字符串的大小
{
return strcmp(str, s.str);
}
int find(String& sub) // 比较一个子串在主串中的位置
{
char* s = strstr(str, sub.str);
if (s == NULL)
return -1;
else
return s - str;
}
String operator+(String& s) // 将两个子串连接成一个新的字符串
{
char* s1 = new char[len + s.len + 1];
strcpy(s1, str);
strcat(s1, s.str);
String newstr(s1);
delete[] s1;
return newstr;
}
};
int main()
{
String s1("hello");
String s2("world");
String s3 = s1 + s2;
int len = s1.length();
String sub = s1.substr(1, 3);
int cmp = s1.compare(s2);
int pos = s1.find(sub);
cout << "1.求字符串的长度:" << len << endl;
cout << "2.从主串中取一个子串:" << sub << endl;
cout << "3.比较两个字符串的大小:" << cmp << endl;
cout << "4.比较一个子串在主串中的位置:" << pos << endl;
cout << "5.将两个子串连接成一个新的字符串:" << s3 << endl;
cout << "0.退出系统" << endl;
return 0;
}
```
程序界面如下所示:
```
1.求字符串的长度:5
2.从主串中取一个子串:ell
3.比较两个字符串的大小:-15
4.比较一个子串在主串中的位置:1
5.将两个子串连接成一个新的字符串:helloworld
0.退出系统
```
该程序实现了您提出的所有功能,并且提供了一个简单的用户界面。用户可以根据需要选择执行相应的操作。
c语言标准函数库中包括 strstr 函数,在主串中查找子串。作为练习,我们自己编写一个功能与之相同的函数。
### 回答1:
可以编写一个自定义函数来实现在主串中查找子串的功能。该函数可以使用循环和字符串比较来实现。以下是一个示例代码:
```c
#include <stdio.h>
#include <string.h>
char* my_strstr(const char* str, const char* substr) {
int len1 = strlen(str);
int len2 = strlen(substr);
int i, j;
for (i = 0; i <= len1 - len2; i++) {
for (j = 0; j < len2; j++) {
if (str[i+j] != substr[j]) {
break;
}
}
if (j == len2) {
return (char*) &str[i];
}
}
return NULL;
}
int main() {
char str[] = "hello world";
char substr[] = "world";
char* result = my_strstr(str, substr);
if (result != NULL) {
printf("Found substring at index %ld\n", result - str);
} else {
printf("Substring not found\n");
}
return 0;
}
```
该函数接受两个参数,分别是主串和子串。它首先计算主串和子串的长度,然后使用两个嵌套的循环来比较主串中的每个可能的子串是否与子串相等。如果找到了相等的子串,则返回该子串在主串中的指针。如果没有找到,则返回 NULL。在主函数中,我们使用该函数来查找子串,并打印结果。
### 回答2:
strstr函数是C语言标准函数库中提供的一个用于查找字符串的函数,其作用是在主串中查找子串。与之相同的函数可以通过自己编写来实现,下面我们来介绍一下该如何实现。
首先需要明确的是,要实现一个类似于strstr的函数,需要考虑以下两个方面:
1. 查找子串的过程
2. 返回结果的形式
对于第一个问题,可以采用类似于暴力匹配的方法。即先确定子串的起始位置,然后从该位置开始与主串逐个字符进行比较,如果完全匹配成功,则返回子串在主串中的起始位置。如果比较过程中存在不匹配的情况,则需要重新确定子串的起始位置继续匹配。
对于第二个问题,可以采用返回指针的方式,将子串在主串中第一次出现的位置的指针返回给调用者。如果在主串中不存在与子串匹配的情况,则返回空指针。
下面给出一份示例代码:
```
#include <stdio.h>
char *my_strstr(char *str1, char *str2) {
char *p1, *p2;
for (; *str1 != '\0'; str1++) {
p1 = str1, p2 = str2;
while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2) {
p1++;
p2++;
}
if (*p2 == '\0') {
return str1;
}
}
return NULL;
}
int main() {
char *str1 = "Hello, World!";
char *str2 = "World";
char *result = my_strstr(str1, str2);
if (result == NULL) {
printf("%s\n", "Not Found!");
} else {
printf("The result is: %s\n", result);
}
return 0;
}
```
通过上述代码可以看到,我们定义了一个指针类型的函数my_strstr,该函数接受两个参数:主串str1和子串str2。在函数内部,我们采用了类似于暴力匹配的方式进行查找子串的过程。如果找到了匹配的结果,则返回该子串在主串中第一次出现的位置的指针。如果在主串中不存在与子串匹配的情况,则返回空指针。代码中还包含了一个main函数用于测试。
总的来说,自己编写一个类似于strstr的函数可以帮助我们更好地理解标准函数库中已有函数的实现原理,同时也可以为我们日后的程序设计提供更多的思路和启示。
### 回答3:
strstr函数是C语言标准函数库中非常常用的函数之一,它的作用是在一个字符串中查找另一个字符串,如果能找到,就返回一个指向该字符串开始位置的指针。现在,我们来自己编写一个与之相同的函数。
我们可以通过遍历主串中的每一个字符,来寻找子串是否匹配。具体的实现步骤如下:
1. 首先判断主串和子串是否为空串,如果是,则直接返回NULL。
2. 定义两个指针,一个指向主串的起始位置,一个指向子串的起始位置。
3. 进入循环,遍历主串中的每一个字符,在循环中,我们需要比较主串和子串的当前字符是否相同,如果相同,则继续比较下一个字符。
4. 如果主串中的当前字符与子串中的当前字符不同,则重新从主串的下一个字符开始匹配,子串的指针也重新调整。
5. 如果子串中的所有字符都匹配成功,则返回主串中匹配成功的子串的起始位置。
6. 如果主串中的所有字符都遍历完了,而且仍然没有匹配成功的子串,那么就返回NULL。
下面是我的函数实现代码:
char* my_strstr(const char* str, const char* substr)
{
if (*substr == '\0') //如果子串为空串,则返回空指针
return NULL;
while (*str)
{
char* sp = str;
char* ss = substr;
while (*sp && *ss && (*sp == *ss))
{
sp++;
ss++;
}
if (*ss == '\0') //子串中的所有字符都匹配成功
return str;
str++; //主串的指针向后移动一个字符
}
return NULL; //主串中没有匹配成功的子串
}
以上就是我编写的一个完整的与strstr函数相同的字符串匹配函数代码。这个函数算法简单,实现也不难,但也有一些问题,比如在处理大于1G的字符串时,它会表现出较慢的性能。但对于一般的字符串处理,这个函数还是可以胜任的。
总之,学习如何编写类似的标准库函数,可以增强我们的编程能力,让我们更好的掌握C语言的基础知识。
阅读全文
相关推荐
















