用c语言写输入两个字符串s1s2判断s2是否为s1的子串
时间: 2024-06-03 22:10:34 浏览: 197
可以使用strstr函数来判断s2是否为s1的子串。该函数的原型为:
char *strstr(const char *s1, const char *s2);
其中s1是包含要查找的子串的字符串,s2是要查找的子串。如果s2是s1的子串,则该函数返回指向s1中第一个与s2匹配的位置的指针。如果s2不是s1的子串,则返回NULL指针。
下面是一个示例代码:
#include <stdio.h>
#include <string.h>
int main() {
char s1[100], s2[100];
printf("请输入字符串s1:");
scanf("%s", s1);
printf("请输入字符串s2:");
scanf("%s", s2);
if (strstr(s1, s2)) {
printf("s2是s1的子串。\n");
} else {
printf("s2不是s1的子串。\n");
}
return 0;
}
注意,该代码只能判断s2是否为s1的子串,而不能判断s2是不是s1的子序列(即不要求s2必须连续出现在s1中)。如果要判断s2是不是s1的子序列,可以使用更复杂的算法,比如动态规划。
相关问题
c语言编写一个程序,输入两个字符串 s1 和 s2 ,判断 s2 是否是 s1 的子串,如果是,则输出 s2 在 s1 中的起始位置。否则输出 0 输入:两个字符串 s1 和 s2 输出:s2 在 s 1 中的起始位置 或者 输出 0
好的,以下是用C语言实现的程序:
```c
#include <stdio.h>
#include <string.h>
int kmp(const char* s1, const char* s2) {
int n1 = strlen(s1), n2 = strlen(s2);
int nxt[n2];
int i = 0, j = -1;
// 构建 next 数组
nxt[0] = -1;
while (i < n2 - 1) {
if (j == -1 || s2[i] == s2[j]) {
i++, j++;
nxt[i] = (s2[i] == s2[j]) ? nxt[j] : j;
} else {
j = nxt[j];
}
}
// 匹配
i = 0, j = 0;
while (i < n1 && j < n2) {
if (j == -1 || s1[i] == s2[j]) {
i++, j++;
} else {
j = nxt[j];
}
}
if (j == n2) {
return i - n2;
} else {
return 0;
}
}
int main() {
char s1[1000], s2[1000];
int pos;
printf("请输入字符串 s1 和 s2:\n");
scanf("%s%s", s1, s2);
pos = kmp(s1, s2);
if (pos) {
printf("s2 在 s1 中的起始位置是:%d\n", pos);
} else {
printf("s2 不是 s1 的子串。\n");
}
return 0;
}
```
其中,`kmp` 函数实现了 KMP 算法,用于在 `s1` 中匹配 `s2` 是否为其子串。在 `main` 函数中,读入两个字符串并调用 `kmp` 函数进行匹配,输出匹配结果。
C语言输入两个字符串s1和s2(长度均小于20),判断s2是否是s1的子串,如果是,输出yes,否则输出no(不能用strstr函数)
您可以使用双重循环来实现查找子串的功能,具体思路如下:
1. 用两个循环分别遍历s1和s2。
2. 在s1中,如果找到一个字符与s2的第一个字符相等,则进一步比较s1和s2后面的字符是否一一对应,如果不对应,则继续在s1中找下一个与s2第一个字符相等的字符。
3. 如果在s1中找到一个字符与s2的第一个字符相等,并且s1和s2后面的字符一一对应,则说明s2是s1的子串。
以下是C语言代码实现:
```c
#include <stdio.h>
#include <string.h>
int main()
{
char s1[20], s2[20];
int len1, len2, i, j, flag;
printf("请输入两个字符串s1和s2:\n");
scanf("%s%s", s1, s2);
len1 = strlen(s1);
len2 = strlen(s2);
flag = 0;
for (i = 0; i <= len1 - len2; i++) {
for (j = 0; j < len2; j++) {
if (s1[i + j] != s2[j]) {
break;
}
}
if (j == len2) {
flag = 1;
break;
}
}
if (flag) {
printf("yes\n");
} else {
printf("no\n");
}
return 0;
}
```
在代码中,我们首先使用`scanf`函数从标准输入中读取两个字符串s1和s2,然后使用`strlen`函数获取它们的长度。
接下来,使用两个嵌套的循环遍历s1和s2。外层循环从0到len1-len2,因为当s1剩下的字符数小于s2的长度时,s2不可能是s1的子串。内层循环用来比较s1和s2后面的字符是否一一对应,如果不对应,则跳出内层循环继续在s1中查找。如果在s1中找到一个与s2匹配的子串,则将flag标记为1,跳出外层循环。
最后,根据flag的值输出结果。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)