检查字符串是否为反向子串

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. 如何修改它才能工作?

对部分代码稍作修改:

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 指向第一个匹配项的指针。这意味着它包含更多免费信息。