在字符串中查找前缀为后缀

时间:2014-02-23 13:47:52

标签: 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");
    }
}

请帮我指出错误。

2 个答案:

答案 0 :(得分:1)

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

  • 您应该终止辅助字符串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;
}

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

答案 1 :(得分:1)

您的代码中有三个错误。

第一种是计算输入字符串的长度。在循环之后从len减去1是不必要的(为小n模拟此循环以查明原因)。

在这一行:

if (!strcmp(A, B))

您正在比较非空终止字符串,这是未定义的行为。您应该终止字符串AB,或使用strncmp(A, B, n)来比较最多n个字符。

第三个错误是逻辑错误。如果字符串“很好”,您的程序将同时输出YESNO。但是这个应该很容易解决。

相关问题