检查字符串是否为反向子串
Check if string is reverse substring
我需要编写函数来检查字符串 s2 是否是字符串 s1 的反向子字符串,如果条件为真则 return 1。函数应该使用指针运算。
例如:
char s1[] = "abcdef";
char s2[] = "edc";
函数会 return 1 因为字符串 s1 包含反向字符串 s2。
#include <stdio.h>
int reverseSubstring(const char *s1, const char *s2) {
while (*s1 != '[=11=]') {
const char *p = s1;
const char *q = s2;
while (*p++ == *q++)
if (*q == '[=11=]')
return 1;
s1++;
}
return 0;
}
int main() {
char s1[] = "abcdef";
char s2[] = "edc";
printf("%d", reverseSubstring(s1, s2));
return 0;
}
这个函数正好相反。它检查字符串是否是子字符串,在我的例子中它是 returns 0。它应该 return 1. 如何修改它才能工作?
- 注意:不允许使用string.h、stdlib.h库中的函数,也来自 stdio.h 库的 sprintf 和 sscanf 函数。不允许在函数中或全局创建辅助字符串或字符串。
对部分代码稍作修改:
const char *q = s2;
while(*q) q++; // Make q point to end of string
while (*p++ == *--q) // Decrement instead of incrementing
if (q == s2) // If we have traversed complete substring
return 1;
这很可能足以完成一项学校任务,这很可能就是这样。但最好知道操作 q--
将为空字符串调用未定义的行为,因为它会使 q
指向字符串之前的元素。这很容易解决。只需在函数的开头添加 if(*s2 == '[=14=]') return 1;
,因为空字符串是每个字符串的子字符串。
为了完整起见,这里是一个包含一些小修复和优化的完整版本。我还冒昧地用库函数 strlen
替换了一个 while 循环,即使它在任务中是被禁止的。毕竟上面介绍了while循环,strlen
自己实现起来很容易
const char *
reverseSubstring(const char *s1, const char *s2) {
if(*s2 == '[=11=]') return s1;
const char *end = s2 + strlen(s2);
while (*s1 != '[=11=]') {
const char *p = s1;
const char *q = end;
while (*p++ == *--q)) {
if (q == s2) return s1;
}
s1++;
}
return NULL;
}
请注意,我更改了 return 类型。如果未找到匹配项,它 returns NULL
,但如果找到匹配项,它 returns 指向第一个匹配项的指针。这意味着它包含更多免费信息。