c - 子字符串存在于C中的字符串中
问题描述
#include <stdio.h>
#include <string.h>
int main()
{
char str1[80] = "downtown", str2[20] = "town";
int len1 = 0, len2 = 0, i, j, count;
len1 = strlen(str1);
len2 = strlen(str2);
for (i = 0; i <= len1 - len2; i++) {
for (j = i; j < i + len2; j++) {
count = 1;
if (str1[j] != str2[j - i]) {
count = 0;
break;
}
}
if (count == 1) {
break;
}
}
if (count == 1) {
printf("True");
} else {
printf("False");
}
}
在上面的代码中,我试图在不使用字符串函数的情况下解决这个问题,除了strlen()
可以用一个简单的while
循环替换。是否有任何其他检查连续字符的方法,例如首先检查字符是否在字符串中,以及i
索引是否在下一个位置而不是在字符串中随机。
解决方案
这是使用函数的一种非常简洁的方法。它假定str
和sub
都是正确的 C 字符串,并返回指向第一个匹配项和NULL
不匹配项的指针。
char *substr(const char *str, const char *sub) {
if (!*sub)
return str; // Empty string is substring of all strings
while (*str) {
const char *sub1 = sub;
const char *str1 = str;
while (*str1++ == *sub1++) {
if (!*sub1)
return (char *)str;
}
str++;
}
return NULL;
}
此函数与标准函数相同strstr()
,存在于 C 标准库中并在<string.h>
.
推荐阅读
- .net - Azure App 洞察响应时间 HTTP 和 appservice 中记录的第一个依赖项之间的差异
- regex - 使用正则表达式的最近匹配
- java - 删除java中2个字符之间的空格
- typescript - TypeScript: ReturnType -> 如何设置函数返回的函数的返回类型
- android - 用于 EddyStone 信标的 Android 信标库
- blockchain - 如何订阅“日志事件”并在 ThunderCore 上获取通知?
- nginx - Nginx 将 www 重定向到非 www
- python - 通过图形场景中的鼠标操作和鼠标事件使 GraphicsItems 可编辑
- heroku - Heroku Postgres Julia 支持
- javascript - 如何使用 pixi.js 导出具有背景颜色的图像?