c - 在字符串中查找前缀作为后缀

标签 c string

我已经发布了这个问题,但我仍在努力让它正常工作。 Dreamlax 试图通过提供以下步骤来帮助我 -

  • n = 1开始,取字符串的前n个字符。
  • 将它与字符串中的最后 n 个字符进行比较
  • 它们匹配吗?
    • 如果是,打印出前n个字符作为后缀,停止处理。
    • 如果否,递增 n 并重试。尝试直到 n 位于字符串的中间。

这是我的代码,它不起作用:

#include <stdio.h>
#include <string.h>
void main()
{
    int i, T, flag, j, k, len = 0, n;
    char W[20], X[20], A[20], B[20];
    scanf("%d", &T);
    for (i = 0; i < T; i++)
    {
        scanf("%s", W);
        for (len = 0; W[len] != '\0'; len++)
            X[len] = W[len];
        X[len] = '\0';
        len--;
        n = 1;
        while (n < len / 2)
        {
            for (k = 0; k < n; k++)
                A[k] = W[k];
            for (k = 0, j = len - n; W[j] != '\0'; j++, k++)
                B[k] = W[j];
            if (!strcmp(A, B))
            {
                printf("YES\n");
                break;
            }
            else
            {
                n++;
            }
        }
        printf("NO\n");
    }
}

请帮我指出错误。

最佳答案

您的代码中发生了几件事:

  • 你应该用 null 终止你的辅助字符串 AB .或者,yopu 可以比较一下 n第一个字符为 strncmp而不是 strcmp .

  • strcmp是一个比较函数。如果字符串匹配,它返回零。 (比较函数意味着它可以用于排序以确定一个字符串在词法上是否大于或小于另一个字符串。此类函数的命名法是返回负数表示词法较小,正数表示词法较大,零表示相等。 )

  • 你不使用辅助字符串X设法找到长度。您可以使用 strlen 轻松找到字符串的长度, 像 strcmp , 在 <string.h> 中声明

  • 后缀的索引计算已关闭。你的长度len比实际长度少一和W[len]是最后一个字符。不要从你的长度中减去一个。

这是你的代码,重构为一个函数,这样输入和程序逻辑就应该分开:

int is_nice(const char *W)
{
    char A[20], B[20];
    int len = strlen(W);
    int j, k, n = 1;

    while (n < len / 2) {
        for (k = 0; k < n; k++) A[k] = W[k];
        A[k] = '\0';

        for (k = 0, j = len - n; W[j] != '\0'; j++, k++) B[k] = W[j];
        B[k] = '\0';

        if (strcmp(A, B) == 0) return 1;
        n++;
    }

    return 0;
}

上面,我说过你可以使用 strncmp比较字符串中的特定数量的字符。仔细想想,可以省略辅助字符串AB并只比较原始字符串的一部分:

int is_nice(const char *W)
{
    int len = strlen(W);
    int n = 1;

    while (n < len / 2) {
        if (strncmp(W, W + len - n, n) == 0) return 1;
        n++;
    }

    return 0;
}

这节省了大量的复制和一些临时变量,并且还有另一个显着的好处:因为代码不必猜测辅助缓冲区的最大大小,它现在适用于任何大小的字符串。

关于c - 在字符串中查找前缀作为后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21969040/

相关文章:

c - 类似于 stdlib bsearch 的东西,它立即返回更小的元素

在数组的子集上调用 qsort

c++ - C/C++,你能把一个文件#include 到一个字符串文字中吗?

c - 关于字符串长度,终止NUL等

string - Lua string.find 找不到一行中的最后一个单词

循环时更改多维数组第二层的值

c - MPI 程序未按预期工作

c - 循环中的 fgets 重复二维数组中的数据

regex - 在 elisp 中寻找替换字符串函数

java - 用字符打印火车